看了篇好文,dll导出类的,之前已经胡乱写,以后可以参考这个规范

前言/引用

转自: 编写DLL所学所思(2)——导出类
参考: HowTo: Export C++ classes from a DLL

这种方式是比较合适的,跟com类似。结构是这样的:
导出类是一个派生类,派生自一个抽象类——都是纯虚函数。使用者需要知道这个抽象类的结构。DLL最少只需要提供一个用于获取类对象指针的接口。使用者跟DLL提供者共用一个抽象类的头文件,使用者依赖于DLL的东西很少,只需要知道抽象类的接口,以及获取对象指针的导出函数,对象内存空间的申请是在DLL模块中做的,释放也在DLL模块中完成,最后记得要调用释放对象的函数。
这种方式比较好,通用,产生的DLL没有特定环境限制。借助了C++类的虚函数。一般都是采用这种方式。除了对DLL导出类有好处外,采用接口跟实现分离,可以使得工程的结构更清晰,使用者只需要知道接口,而不需要知道实现。

DLL代码

导出的头文件(外部exe包含的接口头文件)

//dll导出类
//dll跟其使用者共用的头文件
#pragma  once
#ifdef MATUREAPPROACH_EXPORTS
#define MATUREAPPROACH_API __declspec(dllexport)
#else
#define MATUREAPPROACH_API __declspec(dllimport)
#endif
class IExport
public:
    virtual void Hi() = 0;
    virtual void Test() = 0;
    virtual void Release() = 0;
extern "C" MATUREAPPROACH_API IExport* _stdcall CreateExportObj();
extern "C" MATUREAPPROACH_API void _stdcall DestroyExportObj(IExport* pExport);

继承自导出类实现类,头文件

//dll导出类
// 实现类
#pragma once
#include "MatureApproach.h"
class ExportImpl : public IExport
public:
    virtual void Hi();
    virtual void Test();
    virtual void Release();
    ~ExportImpl();
private:

继承自导出类实现类,cpp文件

#include "stdafx.h"
#include "ExportClassImpl.h"
void ExportImpl::Hi()
	wcout << L"Hello World" << endl;
void ExportImpl::Test()
	wcout << L"Hi cswuyg" << endl;
void ExportImpl::Release()
	delete this;
ExportImpl::~ExportImpl()
	cout << "Release OK" << endl;

exe调用

#include "stdafx.h"
#include "MatureApproach.h"
#pragma comment(lib, "../debug/MatureApproach.lib")
int _tmain(int argc, _TCHAR* argv[])
	IExport* pExport = CreateExportObj();
	pExport->Hi();
	pExport->Test();
	DestroyExportObj(pExport);
	system("pause");
	return 0;

示例Demo

自己动手跟着写了个demo加深记忆 ,包括mfc dll 和 win32 dll两种

demo下载

DLL地狱概念

https://www.cnblogs.com/mountain-mist/articles/1597877.html

DLL导出类避免地狱问题的完美解决方案

下面这个链接应该最早的出处,大部分版本都是出自这个吧
http://club.topsage.com/thread-497586-1-1.html

看了篇好文,dll导出类的,之前已经胡乱写,以后可以参考这个规范前言/引用转自:编写DLL所学所思(2)——导出类 参考:HowTo: Export C++ classes from a DLL这种方式是比较合适的,跟com类似。结构是这样的: 导出类是一个派生类,派生自一个抽象类——都是纯虚函数。使用者需要知道这个抽象类的结构。DLL最少只需要提供一个用于获取类对象指...
1 基本概念 1.1 动态链接库 库是写好的现有的,并且可以复用的代码。现实开发中每个程序都要依赖很多基础的底层库,不可能每个功能都从零开始开发,因此库是必须存在的。库的本质是一种可执行的二进制文件,可以被操作系统加载到内存中执行,库有两种:静态链接库(简称为静态库)和动态链接库(简称为动态库),所谓静态、动态是指链接,一个程序编译成可执行文件步骤如下图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgwmgSGt-1646739553600)(img\编译过程.PN
1.如何在Release状态下进行调试   Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database。在Link标签中选Generatedebu复选框。 注:只是一个介乎Debug和Relea
我的文件结构有2层: 1,建立一个dll生成项目,用来导出; 2,建立一个win32控制台,里面新建一个继承dll导出,并重写其中的虚拟函数,依旧为单利模式,并在main中调用该。 我新建的文件图如下 代码如下: 1.Make...
msvcp140.dll丢失的解决方法: 1. 重新安装相关程序:如果你遇到了msvcp140.dll丢失的问题,可以尝试重新安装相关程序,比如Microsoft Visual C++ Redistributable。 2. 下载msvcp140.dll文件:你可以在网上下载msvcp140.dll文件,然后将其放置在正确的文件夹中。但是需要注意的是,下载的文件一定要来自可靠的网站。 3. 运行系统文件检查器:你可以运行系统文件检查器来修复系统文件,包括msvcp140.dll文件。 4. 更新Windows系统:如果你的Windows系统版本过旧,可能会导致msvcp140.dll丢失的问题。你可以尝试更新Windows系统,以解决这个问题。 5. 手动注册msvcp140.dll文件:你可以使用命令提示符手动注册msvcp140.dll文件,具体方法可以在网上搜索相关教程。