在某些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 int (CALLBACK* CV_AutoRead)(nAutoRead aEventFun);
答案 0 :(得分:1)
这与回调所需的调用约定说明符__stdcall
有关。默认情况下,callbackFunc
使用__cdecl
,导致错误。
要解决此问题,请按以下方式声明callbackFunc
:
int __stdcall callbackFunc(char *);
您还需要将__stdcall
添加到函数定义中。
有关此主题的更多信息,请参阅Argument Passing and Naming Conventions。