DLL一般有2种写法。
第一种用MS.NET的向导帮助就能生产一个DLL,很简单。也就是有个类的头文件,写好DLL后把DLL和头文件给调用端一起使用。
第二种是写一个接口文件。
在这里,我介绍一下通过接口文件写DLL。接口文件主要就是用到纯虚类。(我以前明白什么是纯虚类,但就是不知道怎么用。也看过关于接口的介绍,但没有看到实际的例子)
MSDN关于DLL也提到一句话,就是通过接口来写,但具体怎么写就没说了。
我们需要一个接口文件(h文件),一个实现接口的类的文件(h和cpp文件或者只有h文件)
接口文件名一般用“I”开头,实现接口的类的文件一般用Impl结尾。例如:
//---------------------接口文件 IMyDLL.h ------
struct IMyDLL
{
virtual void Init() = 0;
}
//-------------------实现文件 MyDLLImpl.h --------
//继承IMyDLL
#include "IMyDLL.h"
class CMyDLLImpl : public IMyDLL
{
virtual void Init();
}
//-----------------实现文件 MyDLLImpl.cpp --------
#include "MyDLLImpl.h"
void CMyDLLImpl::Init()
{
; //真正实现的代码
}
现在剩下的事情就是写DLL文件了
//-------------DLL文件 MyDLL.h ---------------
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
MYDLL_API void * CreateIMyDLL();
//------------DLL文件 MyDLL.cpp --------------
#include "MyDLL.h"
#include "MyDLLImpl.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
MYDLL_API void * CreateIMyDLL()
{
CMyDLLImpl * pMyDLLImpl = new CMyDLLImpl();
return static_cast<void *> (pMyDLLImpl);
}
这样基本上就写完了。调用端使用的时候只要DLL的头文件(MyDLL.h),库文件和接口文件(IMyDLL.h)
为什么要使用接口写DLL,一个原因也就是MSDN说的在某些时候如果你给调用端一个类的头文件,可能这个头文件需要include很多其他的文件,对调用端并不合适。
我自己也碰到过类似的问题,调用端不能编译,后来改成接口文件就好了。
使用接口文件,就没有其他的什么文件。另外一个原因就是接口设计自身的好处了,这里就不说了。
经验分享,如何写DLL
最新推荐文章于 2024-03-13 16:10:40 发布