关于特定情况下的调用,比如DLL函数中使用到了 Win32 API 或者将 C++ 生成的 DLL 供标准C语言使用,则需要注意以下一些情况:
如果使用到了 Win32 API,则应该使用关键字 __stdcall
在将 C++ 生成的 DLL 供标准C语言使用时,输出文件需要用 extern "C" 修饰,否则不能被标准
C语言
调用。如果使用 __stdcall 调用方式,可能产生C不识别的修饰名,所以设置导出函数时要采用 .def 文件形式,而不是__declspec(dllexport) 形式。后者会进行修饰名转换,C语言无法识别函数
。
// SampleDLL.def
LIBRARY "SampleDLL"
EXPORTS
HelloWorld 示例 DLL 和应用程序
// SampleDLL.cpp
#include "stdafx.h"
#define EXPORTING_DLL
#include "SampleDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
return TRUE;
void HelloWorld() {
MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
// File: SampleDLL.h
#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;
#elseextern __declspec(dllimport) void HelloWorld() ;
#endif
#endif
下面的代码是一个“Win32应用程序”项目的示例,该示例调用 SampleDLL DLL 中的导出 DLL 函数。
// SampleApp.cpp
#include "stdafx.h"
#include "SampleDLL.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
HelloWorld();
return 0;
注意:在加载时
动态链接中,您必须链接在生成 SampleDLL 项目时创建的 SampleDLL.lib
导入库。
在运行时动态链接中,您应使用与以下代码类似的代码来调用 SampleDLL.dll导出 DLL 函数。
//...
typedef VOID (*DLLPROC) (LPTSTR);
//...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;
hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");
if (HelloWorld != NULL)
(HelloWorld);
fFreeDLL = FreeLibrary(hinstDLL);
//...
kernel32.dll
user32.dll
与 Windows 管理有关的函数。消息、菜单、
光标、
计时器、通信和其他大多数非现实函数都可以从这里找到。
gdi32.dll
图形设备接口库。与设备输出有关的函数:大多数绘图、显示场景、
图元文件、坐标及其字体函数都可以从这里找到。
comdlg32.dll / lz32.dll / version.dll
comctl32.dll
一个新的 Windows 控件集合,比如 TreeView 和 RichTextBox 等等,最初这个是为了 Windows 95 而制作的,但是也使用于 NT 下。
mapi32.dll
电子邮件的专用函数。
netapi32.dll
访问和控制网络的函数。
odbc32.dll