WSASocket定义在哪里?

t1qtbnec  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(159)

我试着用WSASocket动态链接winsock函数,下面的代码编译就好了

  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <windows.h>
  4. typedef SOCKET (WINAPI * pWSASocket)(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
  5. int main()
  6. {
  7. HMODULE hmod = LoadLibrary("ws2_32.dll");
  8. if (hmod == NULL)
  9. {
  10. printf("Failed to load ws2_32.dll\n");
  11. exit(EXIT_FAILURE);
  12. }
  13. pWSASocket WSASocket = (pWSASocket)GetProcAddress(hmod, "WSASocket");
  14. if (WSASocket == NULL)
  15. {
  16. printf("Failed to find function WSASocket\n");
  17. exit(EXIT_FAILURE);
  18. }
  19. return 0;
  20. }

但是当运行二进制文件时,我得到错误Failed to find function WSASocket
根据WINAPI文档,WSASocket应该在Ws2_32.dll中,但GetProcAddress返回NULL

zkure5ic

zkure5ic1#

WSASocket是在 WinSock2.h 中声明的预处理器符号,而不是导出符号的名称。ws2_32.dll 导出的符号名为WSASocketAWSASocketW
因为你的函数指针声明使用了LPWSAPROTOCOL_INFOA,你可能需要解析WSASocketA。如果您使用load-time dynamic linking,这将产生一个弃用警告。
如果这是你关心的事情,链接到WSASocketW符号,并在函数指针声明中使用LPWSAPROTOCOL_INFOW

相关问题