动态dll接口定义的常用规范和载入方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fripy/article/details/89069090

一、动态DLL中导出头文件编写规范案例如下:

#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class IXXCallback //定义某功能对象接口回调函数
{
public:
	virtual ~IXXCallback() {};
	virtual void OnMsg(int msgid, void* data) = 0;
};
class IXXCtrl //定义某功能对象接口方法
{
public:
	virtual ~IXXCtrl() {};
	virtual void SetXXCallback(IXXCallback* pCallback) = 0;//设置回调接口
	virtual void SetValue(int key, double v) = 0;//设置属性
	virtual void InvokeFunc(int id,void* val) = 0;//调用方法
};
MY_API IXXCtrl* __stdcall CreateXXCtrl(); //定义创建某功能对象方法
#endif

涉及三点:

1)定义某功能对象接口类;

(2)定义某功能对象回调函数接口类;

(3)定义创建某功能对象的函数方法。

二、在cpp文件里面对IXXCtrl接口继承子类实现详细的逻辑和添加回调函数的调用。这样能做到只暴露接口不暴露更多细节(类成员属性或私有变量、处理逻辑等)的好处。

三、导出def文件

    在def导出函数文件中要添加MY_API IXXCtrl* __stdcall CreateXXCtrl()函数的声明,如下:

    EXPORTS

      CreateXXCtrl

四。在调用工程当中,动态载入 DLL的调用方法如下

    动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数。

    方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中把它给卸载。

    动态调用使用的 Windows API 函数主要有 3 个,分别是 LoadLibrary、 GetProcAddress 和FreeLibrary。

    这样载入方式有个好处:当工程很大的时候,某些模块不需要,可以不打包对应的模块,而初始运行程序时不会提示缺少某个模块错误而导致应用程序运行不了。

    代码案例如下:

HMODULE hLibModule = NULL;
hLibModule = LoadLibrary(_T("XXMyLib.dll"));
if(!hLibModule)
{
//提示需要动态dll库文件的支持,或自动下载等
reutrn;
}
typedef IXXCtrl* (__stdcall *CreateIXXCtrlFunc)();
CreateIXXCtrlFunc Func = (CreateIXXCtrlFunc)::GetProcAddress(hLibModule,"CreateIXXCtrl");
IXXCtrl * pXXCtrl = Func();
IXXCallback * pCalkBack = new MyCallback;//MyCallback继承自IXXCallback接口类
pXXCtrl->SetXXCallback(pCalkBack );//设置回调接口
pXXCtrl->SetValue(1,1.0);//调用方法等。

 

展开阅读全文

没有更多推荐了,返回首页