我正在try 动态链接从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

推荐答案

WSASocket是在WinSock2.h中声明的预处理器符号,而不是导出符号的名称.由ws2_32.dll输出的符号被命名为WSASocketAWSASocketW.

因为您的函数指针声明使用LPWSAPROTOCOL_INFOA,所以您可能希望解析WSASocketA.如果您使用load-time dynamic linking,这将产生一条不推荐使用的警告.

如果这是您所关心的,请改为链接到WSASocketW符号,并在函数指针声明中使用LPWSAPROTOCOL_INFOW.

C++相关问答推荐

ATTiny1606定时器TCA 0中断未触发

来自stdarg.h的c中的va_args无法正常工作<>

数据包未从DPDK端口传输到内核端口

GCC预处理宏和#杂注GCC展开

为什么在函数内部分配内存空间时需要添加符号?

在一个小型玩具项目中实现终端历史记录功能

ATmega328P EEPROM未写入

在列表中插入Int指针(C)

Kdb:仅升级指定的列

为 struct 中的数组动态分配内存时出错

运行时错误:在索引数组时加载类型为';char';`的空指针

int * 指向int的哪个字节?

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

计算SIZE_MAX元素的长数组的大小

如何编写postgresql支持函数

按字典顺序打印具有给定字符的所有可能字符串

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

C 语言中 CORDIC 对数的问题

OpenGL 中的非渐变 colored颜色 变化

strlen 可以是[[未排序]]吗?