有关c++加载dll的问题

撸红薯 发布于 2012/11/02 18:50
阅读 1K+
收藏 0

最近还是研究基于com的程序插件实现。

我是希望 一个 EXE(主程序)可以使用很多dll写的插件。但是我又希望dll可以调用主程序提供的一些函数接口。这个功能如何实现。


我想到的是把底层API(主程序)的编译成一个dll。然后每个插件都已com的方式调用这个dll。不知道每个dll里面再去加载API的dll  会不会出现API的dll重复加载,函数和数据能不能共享这类问题啊。。。。。。。。。。。

加载中
0
小耶果
小耶果

插件体系有二点要注意:1 是动态载入 2 是契约式编程

首先主程序(exe)启动搜索指定插件目录,这个插件目录里存放的是你自己或第三方实现的(在windows上通常是dll文件)

然后载入,如果是一般的dll使用LoadLibrary和GetPorcessAddress载入,然后调用指定接口,如果dll是com实现,那么标准初始化com即可

至于契约式编程,也就是你要提供插件编写的一个框架(sdk),所有插件必须遵循你框架定义的接口来实现(com的简化版).基本就是这样...

至于插件和主程序的数据共享,共享内存,管道,消息,hook,信号槽等等不一而足,或者注册表,ini,xml,socket都可以.至于com的实现,线程模型等都是要注意的地方

撸红薯
撸红薯
回复 @小耶果 : 这个不会反正是com的 的计数来维护生命周期
小耶果
小耶果
回复 @breakerror : 简单的说就是exe和dll之间malloc和free混用.
撸红薯
撸红薯
回复 @小耶果 : malloc and free之间的共享啥意思?
小耶果
小耶果
回复 @breakerror : 你说的共享可能是指read,我这里的共享是指malloc and free之间的共享.如果只read,那没有问题.
撸红薯
撸红薯
回复 @小耶果 : dll里面的类厂不是返回一个类的对象的指针数据么。这个指针指向的内存不是dll里面new出来的么。为啥不能共享内存啊
下一页
0
Lunar_Lin
Lunar_Lin
dll 只加载一份,一次  放心.
0
地瓜儿
地瓜儿
老鬼现在出书很忙、、、怎么没人回答了?好吧  回答你 “  然后每个插件都已com的方式调用这个dll ”这句话有误,首先自己去查查com的概念;并且都是可执行程序调用dll,不能反过来dll在调用可执行程序里面的函数;而是dll里面处理后返回值结果给可执行程序。      再者问问链接库在功能上划分为几种?各有什么特性?   在进一步问问com组件dll在每次软件调用的时候,com组件需要做什么才能正确被调用?然后在上网查查,动态链接库互相调用可不可以?  自己写一个Test实例玩玩你就明白了、、、  
平原君
平原君
dll是可以调用exe里面的函数的,只要这个函数导出了,当然,可能会出现循环调用的情况,所以最好不要这么玩。 插件体系,说到底,用显示加载dll的方式就可以完成了,只是接口如何约定,需要搞搞
撸红薯
撸红薯
我现在是主程序编译的时候使用了 这个伪com的接口文件,然后我想dll可以使用主程序提供的API 就这个部分我不是很明白!!
撸红薯
撸红薯
我不是微软的com。为了不依赖注册表我自己维护一个xml的数据表。自己是实现的Iunkown 然后自己的类厂算是一个伪com吧。
0
中山野鬼
中山野鬼

引用来自“breakerror”的答案

c++你当我不会。微软的开发环境你也当我不会。我只是个搞C的。哈。
撸红薯
撸红薯
囧~~~~
0
小耶果
小耶果
简单的说就是exe里声明纯虚类,dll里实现这个虚类.调用时加载该dll,利用dll的导出函数创建这个类,然后exe负责调用方法即可.注意,数据共享以谁申请,谁释放为原则.
撸红薯
撸红薯
回复 @小耶果 : 这样还是有问题 我把对外开放的功能(API)写成dll给第三方调用。那么主程序还是要和这个dll通讯啊!
小耶果
小耶果
回复 @breakerror : 我没搞定你什么意思,但是如果你的主程式有功能想提供给第三方 com,或者其他dll使用的话,那就把允许使用的功能做成单独的一个模块,可以是com,也可以是一般dll.这样你主程式或者其他都可以使用了.
撸红薯
撸红薯
回复 @小耶果 : 你讲的事件我认为是主模块获得事件,就会去调用com的函数么?但是我不想这么复杂。我就想简单的可以再com了可以像调用函数一样调用核心程序的API
小耶果
小耶果
回复 @breakerror : 主程序提供功能给dll使用吗?发法很多啊.可以类似winamp做法dll向主窗体发送消息(事先约定消息类型),或者把函数在exe内导出(exe同样可以类似dll一样导出函数),或者任何进程通知方法等.
撸红薯
撸红薯
回复 @小耶果 : 你可以大致简述一下 主程序就是核心程序提供API的思路么?这个我有点搞不清头脑!
下一页
0
岛
你参考一下 ogre吧  他的插件模式就是你要的     回答完毕  
撸红薯
撸红薯
回复 @岛 : 可是不好找啊 你现成的博文么?
岛
@breakerror 你需要的那部分不多
撸红薯
撸红薯
回复 @岛 : 你不觉得这个东西代码太多了么
岛
回复 @breakerror : 我说的是设计模式 无语
撸红薯
撸红薯
@岛 囧这个是3d库啊
返回顶部
顶部