1.系统中大部分包含公用代码的模块,都有可能是动态链接库
2.库的入口函数对应用程序是不可见的,它仅供操作系统使用。Windows在库加载、卸载、进程中线程的创建和结束等时候调用入口函数,以便动态链接库采取相应的工作。
入口函数的结构一般为:
DllEntry proc hInstDll,dwReason,dwReserved
mov eax,dwReason
.if eax == DLL_PROCESS_ATTACH
;保存hInstDll 和初始化操作
.if 成功
mov eax,TRUE
.else
mov eax,FLASE
.endif
.elseif eax == DLL_THREAD_ATTACH
;为新线程分配资源
.elseif eax == DLL_THREAD_DETACH
;线程释放资源
.elseif eax == DLL_PROCESS_DETACH
;释放库使用的资源
.endif
ret
DllEntry endp
3.库能正常装入所必须的代码是 入口函数
4.库使用导出函数(*.def文件)通过 EXPORTS 关键字指定需导出的函数
5.库的发布:若为最终产品,只需发布dll文件;若组件,提供二次开发,则需发布dll文件,lib、inc以及其他语言对应的头文件
6.动态链接库的使用:
6.1常规方法: 使用 include ***.inc 和 includelib ***.lib 直接调用库函数 ;使用方便,但是如果装入DLL过程中有任何错误(dll丢失、初始化失败、找不到导出函数等),应用程序无任何机会完成应变措施
6.2动态装入:让应用程序代替Windows完成装入工作。涉及函数:LoadLibrary(装入动态链接库)、FreeLibrary(释放库)、GetProcAddress(获得导出函数地址)
7.不同的进程共享库的代码,但数据是独立的(共享数据除外)
8.库的数据共享:未初始化数据段 .data? 的节区名称为 .bbs,只要在链接选项中加上 /section:.bbs,S 选项即可将 .data? 段的属性设置为共享。私有数据请放在 .data段中。
9.混合编程,书写供C语言使用的头文件:
#ifdef __cplusplus
extern "C" {
#endif
__stdcall 函数名;
...
#ifdef __cplusplus
}
#endif