看了篇好文,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两种
DLL地狱概念
https://www.cnblogs.com/mountain-mist/articles/1597877.html
DLL导出类避免地狱问题的完美解决方案
下面这个链接应该最早的出处,大部分版本都是出自这个吧
http://club.topsage.com/thread-497586-1-1.html