准备好了这样的函数,其中一些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))。
答案 0 :(得分:1)
您缺少函数指针类型的__stdcall
调用约定,该约定来自WINAPI
宏。因此,编译器假定此指针的默认__cdecl
调用约定。这两个调用约定不兼容。
考虑创建此typedef:
typedef int WINAPI (*WSAStartupCallback)(WORD, LPWSADATA);
然后声明你的函数:
int StartWinSock(WSAStartupCallback wsaStartup)
{
}
然后,您应该能够使用外部WSAStartup
指针调用此函数。