动态连接库(DLL)

来源:互联网 发布:淘宝阿里旅行投诉电话 编辑:程序博客网 时间:2024/05/09 11:18
 把C++的类写进DLL里,单独的编译。程序运行时可以快速装载并连接到DLL上,这样叫做标准的模块软件。大大提高代码的重用型。DLL是运行时的模块。

  Win32 DLL允许导出全局变量,就象导出函数一样。只要DLL申请内存,就从客户程序的进程的内存堆中进行内存分配。

  DLL包含一个导出函数表,它包含了函数在DLL内的地址,但当客户程序装入DLL时并不知道要调用的函数地址,它是通过函数的符号化名字和序号来识别这些函数的。简单的程序通常是一个EXE从一个或多个DLL导入函数;

  而实际上许多DLL调用了其他DLL里的函数。因此一个DLL可以同时有导入和导出。

  在DLL代码中,我们必须显示声明导出函数在客户方也应声明对应的导入函数:

_declspec(dllexport) int MyFunction(int n); //DLL中
_declspec(dllimport) int MyFunction(int n); //exe


  可以用将 extern"c" 加在函数声明的前面的方法来告诉编译器-需要使用普通的函数名,以防编译器产生其他语言不能使用的修饰名。

  连接DLL可以是隐式连接或显式连接,隐式连接在客户程序被装载时装载,显式连接可以决定什么时候装载或卸出,还允许我们在运行时决定装载哪个DLL。

  DLL的入口点是DllMain。进程中的每一个DLL都有一个唯一的32位HINSTANCE值所标识。此外进程本身也有一个HINSTANCE值,所有这些实例句柄只有在进程内部有效,它代表了DLL或EXE的起始虚拟地址。进程(EXE)实例句柄几乎总是0X400000,而装入在默认基地址的DLL的句柄是0X10000000,如果有多个DLL,则每个都有不同的HINSTANCE值。

  获得EXE的句柄用NULL参数调用Win32的GetModuleHandle函数,获得DLL的句柄用DLL的名字做参数调用GetModuleHandle函数。
原创粉丝点击