动态链接库(DLL) (含进程通信之共享内存)

 

简单的DLL

 

 

DllMain是DLL的入口与出口,进行初始化与退出处理。如果初始化成功应返回TRUE。当程序加载DLL时,fdwReason为DLL_PROCESS_ATTACH;不再使用时,Windows调用DllMain,fdwReason为DLL_PROCESS_DETACH,进行一些清理工作。当加载的DLL进程创建线程时,Windows调用DllMain,参数为DLL_THREAD_ATTACH,线程结束,DLL_THREAD_DETACH。如果创建线程之后加载DLL,DLL_THREAD_DETACH可能没有DLL_THREAD_ATTACH。

 

动态链接库不能被执行,不能接收消息,它们是包括一些可以被其他程序或DLL调用的独立文件。动态链接库文件包括系统DLL文件、各种驱动文件(.DRV),一些动态链接库只有数据,没有代码,如字体文件。

动态链接库可以是任意扩展名(如.exe或.fon),但只有标准扩展名(.dll)才能被Windows自动加载,其他模块必须用LodaLibrary或LoadLibraryEx函数加载。

 

动态链接库分配的内存空间由应用程序所有,不同的应用程序调用相同的DLL数据不同。如果想要的数据内存在不同的应用程序或同一应用程序的不同实例之间共享,就要用到共享内存,实际上是一个内存映射(Memory-mapped)文件。在#prama data_seg("shared")与#pragma data_seg()之间定义的变量都可共享,但必须要初始化,否则编译器会把变量定义在未初始化数据区,而不是"shared"。“shared”是数据区名称,可以随意取。为共享数据,还要修改链接器命令,加上“/SECTION:shared,RWS”参数,或者在源文件中加入链接命令#prama comment(linker,"/SECTION:shared,RWS"),告诉链接器shared数据区有读写共享属性。

 

在动态链接库中可以加载资源(图标、字符串、位图等)。如果从该库中加载,需要自己的实例句柄(DllMain的hInstance参数);如果从调用它的EXE文件中加载,则需要程序实例句柄。

在动态链接库中注册窗口类或创建窗口有些麻烦。这两个功能都要用实例句柄,如果使用动态库的句柄,窗口消息仍然通过调用它的程序窗口。所以如果必须要这样,最好使用调用它的实例句柄。由于模态对话栻在消息循环之外,DialogBox可以用动态库的实例句柄。

 

运行时动态链接

如果在程序运行过程中才能确定需要加载哪个DLL,就必须用这种方法。

LoadLibrary(szDll):加载szDll,返回HANDLE。加载成功后可以用GetProcAddress(hLibrary,szFunction)获得函数地址,或用LoadBitmap等加载资源。

FreeLibrary(hLibrary):释放动态库。Windows中每个DLL都有引用数,加载一次引用数加1,释放一次引用数减1,当引用数为0时,Windows就把该库从内存中移除。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值