不清楚为什么写成 CALLBACK* DlgCloseUDPNet 类型

近日对动态调用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. )

--------------------------------------------------------------------------------------------

回头查了下回调函数

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值