如何使用Visual C++编写动态链接库(DLL)
DLL的基本结构
在Visual C++ .NET 2003中File|New|Projects, Project Types对话框中选择Visual C++ Project | Win32 | Win32 Project.在Application Wizard对话框中选择Application Settings选项页, Application Type选择DLL。
建立工程后开始书写你的函数。如果函数需要导出,请建立一个.h文件。添加下面的内容。
dll.h:
#ifndef _DLL_H
#define _DLL_H
#ifdef DLL
#define EXTERN extern "C" __declspec(dllexport)
#else
#define EXTERN extern __declspec(dllimport)
#endif
EXTERN int add(int, int);
#endif // _DLL_H
同时要修改你的.cpp文件
dll.cpp:
#define DLL
#include "FaceRec.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
EXTERN int add(int a, int b) {
// Something to do
return a + b;
}
这样就声明导出了一个add(int, int)函数。
这里需要说明几点,要特别注意:
- 由于是使用C++语言,C++支持函数重载。因此导出函数的函数明会因为重载有所变化。所以需要加上 extern “C” 强制使用C语言进行导出。当然这样一来,导出函数也就不能出现重载版本了。
- 另外,由于很多DLL的使用者是使用.lib文件+.h文件的方法(静态方法)访问DLL的,而非LoadLibrary + GetProcAddress的方法(动态方法)。因此我们书写.h文件的时候做一个宏判断如果是在DLL编译中,就定义EXTERN为 __declspec(dllexport)。如果是用户使用就定义EXTERN为extern __declspec(dllimport)。
- 对于C++导出给其他语言(Delphi, C++ Builder)的DLL.要根据其他语言函数的调用方式(Calling Convention)加入适当的修饰符。比如给delphi要用pascal修饰,给Windows API回调要使用stdcall等等。
DLL输出正确与否的检测
进入在Visual Studio .NET 2003的Visual .NET Tools里Visual .NET Command Prompt命令行模式。输入命令
dumpbin /exports dll.dll
来显示dll的导出表,可以看看导出的函数数量和名称是否正确。再对自己的程序进行调整