摘要:阐述Windows和X86环境下动态链接库的使用方式及基本原理,并以一个自定义的动态链接库,来揭示其内部的秘密。通过这种方式可以深入了解动态链接库及这种自定义的动态链接库生成和使用方法,可为简单嵌入式操作系统支持动态链接库功能提供一种思路。
关键词:动态链接库;原理;自定义
1 引言
C\C++编程中库文件有两种形式,一种是静态链接库,另一种是动态连接库。静态链接库的二进制代码在程序链接时,与自己写的程序一起集成到目标文件中融为一体。这样做有两个缺点:首先,假如多个程序都使用了同一个静态库,那么库文件代码将重复占用内存,这是操作系统无法检测的;其次,一旦在库文件中发现了BUG,就必须重新编译目标文件,而无法部分替换目标代码。如果采用动态链接库就可以很好地解决上面两个问题,当然还有其他的优点。可是动态链接库是如何工作的并不是那么好理解,文中力图揭示其原理。
2 概述
动态链接库(DLL)是一种可执行模块,往往以单独的文件形式存在,在Windows下的后缀名一般为.dll。动态链接库有两种使用方法:一个是静态调用,另外一种是动态调用。DLL的静态调用类似于静态库的用法,程序一启动就把DLL中的代码装入内存;这种方法这里不详细介绍。DLL的动态调用稍微麻烦一点,但是它更加灵活,可以更为有效地使用内存。Windows 下DLL的动态调用需要程序员自己调用如下3个关键API来使用相关功能。
加载动态链接库:
HMODULE LoadLibrary( LPCTSTR lpFileName);
获取相关函数地址:
FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName);
释放动态链接库:
BOOL FreeLibrary( HMODULE hModule);
通过GetProcAddress获取指定函数的指针,就可以使用相应函数了。整个使用过程并不复杂,但想要理解DLL内部的秘密可不那么容易。
|