随笔-89  评论-944  文章-0  trackbacks-0

前言:
DLL 是个很久远的文件格式,以至于它只支持导出函数(请忽略 .net 的 DLL)。至于导出 class,也是由于编译系统的支持才勉勉强强能进行,只能静态加载,实际上对于DLL文件来说它导出的还是函数。——以上,个人的一点浅显理解。

问题:
有没有存在一种好的方式,让DLL能够被动态加载,并且能够方便地得到里面的 C++ class 信息?
备选:
1、别想了,老老实实地用吧,还是导出纯C函数= =
2、大胆的导出 class 吧,如果动态加载,自己去拼那些编译后名字吧。。
3、COM 形式?可是,要注册到系统中去,凭空多了系统注册表依赖
4、还有吗?
5、甚至可以抛开DLL,有没有类似的一种方式,可用于二进制代码的模块划分以及闭源的代码重用?

(至于跨平台啥的先不考虑吧,暂定Windows平台下吧)

请不吝指教~

posted on 2010-12-18 22:35 溪流 阅读(2070) 评论(15)  编辑 收藏 引用 所属分类: C++Windows

评论:
# re: 想讨论个话题,关于DLL的使用方式 2010-12-18 22:58 | classyk
如果没有特别要求,可以考虑使用Delay Load来完成类似动态加载的工作,反而操作更加简单。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-18 23:04 | 姚冬
Qt的Qt Plugin不错,引出的是 QObject,可以动态加载和调用  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-18 23:06 | 溪流
@classyk
Delay Load 实际上还是“静态”加载。我想要一个真实的动态加载,编译的时候可以不需要那个 .lib 的。嗯……举个例子,用DLL作为某个插件系统里的插件。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-18 23:19 | 空明流转
CreateFuck();
DeleteFuck();  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-18 23:33 | loadlibrary
google LoadLibrary()
  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-18 23:50 | classyk
@溪流

编译的时候多个lib没关系吧,delay load运行的时候反正是动态加载的。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 00:28 | 溪流
@classyk
我是说,你有可能拿不到这个lib  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 00:29 | 溪流
@loadlibrary
LoadLibrary 怎么了?  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 00:29 | 溪流
@空明流转
这里的 Fuck 是怎样一种形式呢?  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 08:27 | WXX
基于接口的编程

CreateIApp();
DeleteIApp();


interface IClass
{
};

interface IApp
{
virtual IClass* GetIClass() = 0;
...
};  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 09:51 | 大渊献
以至于它只支持导出函数(请忽略 .net 的 DLL)。

正如楼上所说,他还能导出接口。
当然,接口的取得,也只能通过你的导出函数。
但导出函数返回的,就是你的接口了。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 10:18 | 飞舞的烟灰缸
导出接口其实就是COM使用的方式了,实质上是通过导出函数返回一个虚函数表的指针。所以可以不用接口(COM概念上的)而使用纯虚函数(纯虚是为了保证编译通过),外部调用可以使用C++、Delphi(虚表结构和C++相同,但是不支持兼容C++的虚继承)或者用C结构体加函数指针模拟虚表。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式[未登录] 2010-12-19 10:32 | tom
1. XP以后的平台(含XP)COM是可以免注册的,Win7等微软自己新写的COM很多就采用这种方式了,基本原理就是自带干粮,manifest file.
2. 跨编译器的导出C++ class的方式,一般是DLL采用Singleton模式编写,导出C指针。Codeproject上有一篇文章讲这个 (http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx)
3.如果有兴趣或者是没兴趣(只想用用)可以看看boost.extension.注意这个还不是标准的boost库成员。也没被提交review过。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-19 14:09 | WXX
基本原理就是自带干粮,manifest file

com的dll自身就是带有类型库,可以使用CoLoadLibrary CoGetClassFactory等标准com api去调用组件,这个是建立在对com库加载熟悉的前提下。  回复  更多评论
  
# re: 想讨论个话题,关于DLL的使用方式 2010-12-23 00:11 | 欲三更
其实dll导出类还是挺好用的,虽然有各种各样的限制,但是它使用起来是最好看的,比c函数和接口导出都好看。

基本上如果你手上有一个有源码的类库,在不考虑模板的前提下,编译成dll使用还是很方便的。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理