0

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

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

}

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

StartWinSock(WSAStartup);

我收到一个错误:

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

另外,我不知道如何通过 WSAStartup() 之类的回调函数正确传递参数(其参数:WORD(无符号短版本号)&& LPWSADATA(对 WSAData 的引用))。

4

1 回答 1

1

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

考虑创建这个 typedef:

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

然后像这样声明你的函数:

int StartWinSock(WSAStartupCallback wsaStartup)
{
}

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

于 2013-04-01T01:24:35.867 回答