__cdecl将WinSock函数包装为普通C中的回调并调用它

时间:2013-04-01 01:17:26

标签: function callback winsock stdcall cdecl

准备好了这样的函数,其中一些WSA函数将用作回调:

int StartWinSock(int (*WSAStartup)(WORD, LPWSADATA))
{

}

但是在其他代码中,我正试图启动它:

StartWinSock(WSAStartup);

我收到了一个错误:

  

'WSClient :: StartWinSock':无法将参数1从'int(__ stdcall *)(WORD,LPWSADATA)'转换为'int(__ cdecl *)(WORD,LPWSADATA)'

另外,我不知道如何通过回调函数正确传递参数,如WSAStartup()(其参数:WORD(unsigned short number of version)&&& LPWSADATA(引用WSAData))。

1 个答案:

答案 0 :(得分:1)

您缺少函数指针类型的__stdcall调用约定,该约定来自WINAPI宏。因此,编译器假定此指针的默认__cdecl调用约定。这两个调用约定不兼容。

考虑创建此typedef:

typedef int WINAPI (*WSAStartupCallback)(WORD, LPWSADATA);

然后声明你的函数:

int StartWinSock(WSAStartupCallback wsaStartup)
{
}

然后,您应该能够使用外部WSAStartup指针调用此函数。