近日对动态调用dll 时定义的 一个函数指针类型不太理解, 不清楚为什么写成 CALLBACK* DlgCloseUDPNet 类型
先查了下 关于 “__stdcall约定”
如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h):
#define CALLBACK __stdcall //这就是传说中的回调函数
#define WINAPI __stdcall //这就是传说中的WINAPI
#define WINAPIV __cdecl
#define APIENTRY WINAPI //DllMain的入口就在这里
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
---------------------------------------------------------------------------
#include "lib.h"
#include "windows.h"
#include "stdio.h"
// lib.cpp : 采用_stdcall修饰导出函数
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("\nprocess attach of dll");
break;
case DLL_THREAD_ATTACH:
printf("\nthread attach of dll");
break;
case DLL_THREAD_DETACH:
printf("\nthread detach of dll");
break;
case DLL_PROCESS_DETACH:
printf("\nprocess detach of dll");
break;
}
return TRUE;
}
//用任何一种方法输出函数时,确保用_stdcall调用约定, _stdcall 调用约定是用来调用Win32 API函数。
//_stdcall 以相反的顺序(从右到左) 把参数推入栈中
int _stdcall add(int x,int y)
{
return x + y;
}
----------------------调用dll 中的add 函数
#include "stdafx.h"-
#include "windows.h"
typedef int (_stdcall * lpAddFun)(int,int);
int main(int argc, char* argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll = LoadLibrary("..\\Debug\\dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll,"add");
if(addFun!=NULL)
{
int result = addFun(2,3);
printf("\ncall add in dll:%d",result);
}
FreeLibrary(hDll);
}
return 0;
}
要动态调用DLL,要清楚其调用函数的导出约定 如果使用的是标准约定_stdcall ,那么导出的函数名就不会改变。
对调用的函数声明一个_stdcall的函数类型。
typedef double(CALLBACK *dll_myadd)(double,double);
(注意: CALLBACK和WINAPI都是__stdcall的一种别名,这个在windef.h中有定义:
#define CALLBACK __stdcall //回调函数用
#define WINAPI __stdcall //WINAPI用
用哪个随便,你也可以直接写__stdcall. )
--------------------------------------------------------------------------------------------
回头查了下回调函数