"深入学习Windows平台下使用VC++进行动态链接库(DLL)编程的第二部分,专注于非MFC DLL的创建和使用。"
在Windows环境下,动态链接库(DLL)是一种共享代码和数据的机制,使得多个应用程序可以同时使用同一份代码库,从而节省内存并方便软件更新。在VC++中,DLL的编程可以分为两类:MFC(Microsoft Foundation Classes)支持的DLL和非MFC DLL。本节主要讲解非MFC DLL的创建和调用。
4. 非MFCDLL
非MFC DLL不依赖于MFC库,因此它更适合那些不需要MFC功能或希望最小化依赖的应用程序。创建非MFC DLL时,我们需要避免使用MFC AppWizard(dll),因为它会生成一个基于MFC的DLL项目。
4.1 一个简单的DLL
为了创建一个非MFC DLL,首先在VC++中新建一个"Win32 Dynamic-Link Library"工程,命名为dllTest,并确保不勾选"MFC AppWizard(dll)"选项。然后添加头文件"lib.h"和源文件"lib.cpp"。在"lib.h"中,我们声明了一个导出的函数`add`,使用`extern "C"`来避免C++的名称修饰,同时使用`__declspec(dllexport)`来指定该函数是DLL导出的:
```cpp
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport) add(int x, int y);
#endif
```
在"lib.cpp"中,我们实现`add`函数:
```cpp
#include "lib.h"
int add(int x, int y) {
return x + y;
}
```
4.2 调用DLL中的函数
为了调用非MFC DLL中的`add`函数,我们需要创建一个新的控制台应用程序工程,例如dllCall。在这个工程中,我们使用`LoadLibrary`函数加载dllTest.dll,然后使用`GetProcAddress`获取`add`函数的地址,并执行此函数:
```cpp
#include <stdio.h>
#include <windows.h>
typedef int (*lpAddFun)(int, int); // 定义函数指针类型
int main(int argc, char* argv[]) {
HINSTANCE hDll; // DLL句柄
lpAddFun addFun; // 函数指针
hDll = LoadLibrary("..\\Debug\\dllTest.dll");
if (hDll != NULL) {
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL) {
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
```
在上述代码中,`LoadLibrary`函数用于加载DLL,`GetProcAddress`用于获取`add`函数的地址,然后通过函数指针调用`add`。成功执行后,`FreeLibrary`释放已加载的DLL句柄,防止内存泄漏。
总结,非MFC DLL编程的关键在于正确地声明导出函数并在客户端应用程序中正确加载和调用这些函数。与静态链接库相比,DLL的主要优势在于代码共享、动态加载和运行时的模块扩展。不过,使用DLL也需要注意版本兼容性、线程安全以及初始化和卸载等问题。