我试着用WSASocket
动态链接winsock函数,下面的代码编译就好了
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
typedef SOCKET (WINAPI * pWSASocket)(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
int main()
{
HMODULE hmod = LoadLibrary("ws2_32.dll");
if (hmod == NULL)
{
printf("Failed to load ws2_32.dll\n");
exit(EXIT_FAILURE);
}
pWSASocket WSASocket = (pWSASocket)GetProcAddress(hmod, "WSASocket");
if (WSASocket == NULL)
{
printf("Failed to find function WSASocket\n");
exit(EXIT_FAILURE);
}
return 0;
}
但是当运行二进制文件时,我得到错误Failed to find function WSASocket
根据WINAPI文档,WSASocket应该在Ws2_32.dll
中,但GetProcAddress
返回NULL
值
1条答案
按热度按时间zkure5ic1#
WSASocket
是在 WinSock2.h 中声明的预处理器符号,而不是导出符号的名称。ws2_32.dll 导出的符号名为WSASocketA
或WSASocketW
。因为你的函数指针声明使用了
LPWSAPROTOCOL_INFOA
,你可能需要解析WSASocketA
。如果您使用load-time dynamic linking,这将产生一个弃用警告。如果这是你关心的事情,链接到
WSASocketW
符号,并在函数指针声明中使用LPWSAPROTOCOL_INFOW
。