为何DLL
先看看静态库与DLL的不同之处
可执行文件的生成(Link期):前者很慢(因为要将库中的所有符号定义Link到EXE文件中),而后者很快(因为后者被Link的引入库文件无符号定义)
可执行文件的大小:前者很大,后者很小(加上DLL的大小就和前者差不多了)
可执行文件的运行速度:前者快(直接在EXE模块的内存中查找符号),后者慢(需要在DLL模块的内存中查找,在另一个模块的内存中查找自然较慢)
可共享性:前者不可共享,也就是说如果两个EXE使用了同一个静态库,那么实际在内存中存在此库的两份拷贝,而后者是可共享的。
可升级性:前者不可升级(因为静态库符号已经编入EXE中,要升级则EXE也需要重新编译),后者可以升级(只要接口不变,DLL即可被升级为不同的实现)
综合以上,选择静态库还是DLL
1. 静态库适于稳定的代码,而动态库则适于经常更改代码(当然接口要保持不变),当DLL更改(仅实现部分)后,用户不需要重编工程,只需要使用新的Dll即可。
2. 由于静态库很吃可执行文件的生成(Link期)时间,所以如果对可执行文件的Link时间比较敏感,那么就用DLL。
使用DLL
在介绍如何创建DLL之前,让我们先了解它是如何被使用的。
1. 显式调用(也叫动态调用)
显示调用使用API函数LoadLibrary或者MFC提供的AfxLoadLibrary将DLL加载到内存,再用GetProcAddress()在内存中获取引入函数地址,然后你就可以象使用本地函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxLoadLibrary释放DLL。
下面是个显示调用的例子,假定你已经有一个Test.dll,并且DLL中有个函数名为Test,其声明式是void();
#include < iostream >
using namespace std;
typedef void(*TEST )();
int main( char argc, char* argv[] ) {
const char* dllName = "Test.dll";
const char* funcName = "Test";
HMODULE hDLL = LoadLibrary( dllName );
if ( hDLL != NULL ) {
TEST func = TEST( GetProcAddress( hDLL, funcName ) );
if ( func != NULL ) {
func();
}
else {
cout << "Unable to find function /'" << funcName << "/' !" << endl;
}
FreeLibrary( hDLL );
}
先看看静态库与DLL的不同之处
可执行文件的生成(Link期):前者很慢(因为要将库中的所有符号定义Link到EXE文件中),而后者很快(因为后者被Link的引入库文件无符号定义)
可执行文件的大小:前者很大,后者很小(加上DLL的大小就和前者差不多了)
可执行文件的运行速度:前者快(直接在EXE模块的内存中查找符号),后者慢(需要在DLL模块的内存中查找,在另一个模块的内存中查找自然较慢)
可共享性:前者不可共享,也就是说如果两个EXE使用了同一个静态库,那么实际在内存中存在此库的两份拷贝,而后者是可共享的。
可升级性:前者不可升级(因为静态库符号已经编入EXE中,要升级则EXE也需要重新编译),后者可以升级(只要接口不变,DLL即可被升级为不同的实现)
综合以上,选择静态库还是DLL
1. 静态库适于稳定的代码,而动态库则适于经常更改代码(当然接口要保持不变),当DLL更改(仅实现部分)后,用户不需要重编工程,只需要使用新的Dll即可。
2. 由于静态库很吃可执行文件的生成(Link期)时间,所以如果对可执行文件的Link时间比较敏感,那么就用DLL。
使用DLL
在介绍如何创建DLL之前,让我们先了解它是如何被使用的。
1. 显式调用(也叫动态调用)
显示调用使用API函数LoadLibrary或者MFC提供的AfxLoadLibrary将DLL加载到内存,再用GetProcAddress()在内存中获取引入函数地址,然后你就可以象使用本地函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxLoadLibrary释放DLL。
下面是个显示调用的例子,假定你已经有一个Test.dll,并且DLL中有个函数名为Test,其声明式是void();
#include < iostream >
using namespace std;
typedef void(*TEST )();
int main( char argc, char* argv[] ) {
const char* dllName = "Test.dll";
const char* funcName = "Test";
HMODULE hDLL = LoadLibrary( dllName );
if ( hDLL != NULL ) {
TEST func = TEST( GetProcAddress( hDLL, funcName ) );
if ( func != NULL ) {
func();
}
else {
cout << "Unable to find function /'" << funcName << "/' !" << endl;
}
FreeLibrary( hDLL );
}