Visual Studio 2010DLL 动态引用和静态应用的要求:引用方式 要求动态引用 MyDLL.dll静态引用 MyDLL.dll,MyDLL.lib,MyDLL.h静态加载 DLL 的步骤如下:1. 将 MyDLL.dll,MyDLL.lib,MyDLL.h 拷贝到目标工程( 需调用 MyDLL.DLL 的工程) 的Debug 目录下2. 配置头文件路径:选择项目->属性->C/C++->常规->附加包含目录:设置头文件路径3. 配置 DLL 和 LIB 文件路径:选择项目 ->属性->连接器->常规->附加库目录:设置 DLL 和LIB 文件路径4. 加载 Lib 文件:方法一:选择项目->属性->连接器->输入->附加依赖项:输入要加载的 Lib 文件名(加载多个 Lib 文件时,以回车为分隔符) 方法二:在程序中使用 #pragma comment(lib," MyDLL.lib ")进行设定5. 配置该应用程序.exe 的生成目录要和加载的 DLL、LIB 放在同一目录:选择项目->属性->连接器->常规->输出文件6. 在目标工程(*.cpp,需要调用 DLL 中的函数) 中加入:#include "MyDLL.h" 动态加载 DLL 的步骤如下:1. 声明头文件,说明要用 windows32 方法来加载和卸载 DLL。
例如:#include2. 用 typedef 定义一个函数指针类型,这个指针类型要与调用的 DLL 引出函数类型和参数保持一致例如:typedef void(*FUN)(int,int); 3. 通过 Win32 API 函数 LoadLibrary()显式的调用 DLL,此函数返回 DLL 的实例句柄这里字符串类型是 LPSTR,当是 unicode 字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可例如:const char* dllName = "MyDLL.dll"; HMODULE hDLL = LoadLibrary(dllName);4. 取到的地址要判断返回的句柄是否为空,如果为无效句柄,那么要释放加载 DLL 所占用的内存例如:if(hDLL != NULL){}else{FreeLibrary(hdll)}5. 定义一个函数指针,用来获取你要用的函数地址,通过 GetProcAdress 来获取函数的地址, 这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄例如:FUN fp = FUN (GetProcAddress (hDLL, funName)); if (fp != NULL) { } 6. 通过函数指针来调用函数。
这里不能用函数名来使用函数,因为这个 DLL 本身不是当前 CPP 的一部分,而是通过 windows 去调用例如:fp(x,y)7. 最后调用结束后,就释放句柄例如:FreeLibrary(hdll)要点 包含头文件 Windows.h,原因在于程序中用到了 LoadLibrary、FreeLibrary 、GetProcAddress 等Win32 API 函数 FUNA 和 FUNB 是函数指针类型的声明 当程序不再使用 dll 时,应该调用 FreeLibrary 及时释放它占用的内存空间 如果在 const char* dllName 和 funName 底部出现红色波浪线提示,说明采用的字符集不匹配,需要修改项目 UseDLL 的属性 CharaterSet 为 Not Set 为方便项目的调试,建议修改解决方案的 Startup Project 属性为 Single startup project 并以UseDLL 为首选以具体实例说明动态加载 DLLMyDLL.h 文件为:1. #ifdef MyDLL_EXPORTS 2. #define MyDLL _API __declspec(dllexport) 3. #else 4. #define MyDLL _API __declspec(dllimport) 5. #endif 6. 7. MyLL_API void Add(int,int); 修改 MyDLL.cpp 文件为: 1. MyDLL_API void Add(int a,int b) 2. { 3. return a+b;4. } 使用 DLL 的代码:1. #include 2. typedef void(*FUN)(int,int); 3. int main() 4. { 5. const char* dllName = "MyDLL.dll"; 6. const char* funName = "Add"; 7. int x(100), y(100); 8. HMODULE hDLL = LoadLibrary(dllName); 9. if(hDLL != NULL) 10. { 11. FUNA fp = FUNA(GetProcAddress(hDLL,funName)); 12. if(fp != NULL) 13. { 14. int sum=fp(x,y); 15. } 16. FreeLibrary(hDLL); 17. }18. }。