使用函数指针作为回调

时间:2014-05-01 13:48:16

标签: c++

在某些SDK中,我有一个采用函数指针的方法。

int AutoRead(nAutoRead aEventFun)

其中参数为:

typedef int (__stdcall *nAutoRead)(char *data);

现在我想在我的代码中使用这个函数:

    // First need to get pointer to actual function from DLL
    CV_AutoRead AutoRead; // CV_AutoRead is typedef for using function pointer 

    AutoRead = (CV_AutoRead)GetProcAddress(g_hdll,"AutoRead");

   // Now I want to use the SDK method and set callback function, 
   // but I get error on the next line
   // error is: 'initializing' : cannot convert from 'int (__cdecl *)(char *)' to 'TOnAutoRead'
   nAutoRead f = &callbackFunc;
   if(0 == AutoRead(f))  // AutoRead - now refers to the SDK function shown initially
   {

   }

其中callbackFunc是:

int callbackFunc(char *data)
{

}

显然我做错了什么。但是什么?

PS。这是CV_AutoRead

的typedef
typedef int (CALLBACK* CV_AutoRead)(nAutoRead aEventFun);

1 个答案:

答案 0 :(得分:1)

这与回调所需的调用约定说明符__stdcall有关。默认情况下,callbackFunc使用__cdecl,导致错误。

要解决此问题,请按以下方式声明callbackFunc

int __stdcall callbackFunc(char *);

您还需要将__stdcall添加到函数定义中。

有关此主题的更多信息,请参阅Argument Passing and Naming Conventions