有什么好的办法以LoadLibrary使用Dll的到出库?

蠓虫带着秤砣飞 2020-09-11 08:03:00
LoadLibrary只能获取导出函数。
可以用到处函数返回一个抽象类的指针,来使用。
这种方式的缺点是如果类很多,需要的导出函数也是非常多。
也不好从返回的类中派生类,组合倒是可以组合但使用起来比较别扭。
有没有什么办法,LoadLibrary可以做到像隐式加载那样的方便使用方式呢?

...全文
301 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mynamelj 2020-09-23
  • 打赏
  • 举报
回复
孤客天涯 2020-09-16
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
[quote=引用 3 楼 孤客天涯 的回复:]利用com原理,要导出来的类定义成纯虚接口,每个接口由一个唯一GUID来标识,各dll用自身的GUID登记接口,每个dll都导出以下几个出函数: // 模块是否支持GUID 为riid的接口 BOOL __declspec(dllexport)__stdcall SupportedInterface(REFIID riid); // 创建当前模块所支持的接口 LPVOID __declspec(dllexport)__stdcall CreateInterFace(REFIID riid); 使用时,需要用到哪个类,就枚举dll,看哪个dll登记了这个GUID,找到这个dll后就调用其CreateInterFace函数将接口创建出来,你就可以用了
这种返回要创建对象,返回指针。 如果类型太多就不好办了。[/quote] 所有接口都派生同一个基类,自己根据GUID强转成你的实际接口类就行了
  • 打赏
  • 举报
回复
引用 3 楼 孤客天涯 的回复:
利用com原理,要导出来的类定义成纯虚接口,每个接口由一个唯一GUID来标识,各dll用自身的GUID登记接口,每个dll都导出以下几个出函数:

// 模块是否支持GUID 为riid的接口
BOOL __declspec(dllexport)__stdcall SupportedInterface(REFIID riid);
// 创建当前模块所支持的接口
LPVOID __declspec(dllexport)__stdcall CreateInterFace(REFIID riid);

使用时,需要用到哪个类,就枚举dll,看哪个dll登记了这个GUID,找到这个dll后就调用其CreateInterFace函数将接口创建出来,你就可以用了


这种返回要创建对象,返回指针。
如果类型太多就不好办了。
孤客天涯 2020-09-15
  • 打赏
  • 举报
回复
利用com原理,要导出来的类定义成纯虚接口,每个接口由一个唯一GUID来标识,各dll用自身的GUID登记接口,每个dll都导出以下几个出函数:

// 模块是否支持GUID 为riid的接口
BOOL __declspec(dllexport)__stdcall SupportedInterface(REFIID riid);
// 创建当前模块所支持的接口
LPVOID __declspec(dllexport)__stdcall CreateInterFace(REFIID riid);

使用时,需要用到哪个类,就枚举dll,看哪个dll登记了这个GUID,找到这个dll后就调用其CreateInterFace函数将接口创建出来,你就可以用了
Yofoo 2020-09-12
  • 打赏
  • 举报
回复
参考COM 导出函数以获取一个 类指针, 类中实现一个类似QueryInterface 可以获取到其他的类
zgl7903 2020-09-11
  • 打赏
  • 举报
回复
再封装一次, 重新做导出接口函数,然后隐式加载
或者把 接口定义 LoadLibrary GetProcAddress 等封装成一个类,做全局变量,然后宏定义的方式定义函数


15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧