【发布时间】:2020-01-09 21:55:30
【问题描述】:
MSDN 上的所有 Winsock2 示例都表明我必须将 Winsock2 库静态链接为:
#pragma comment(lib, "ws2_32.lib")
确保构建环境链接到 Winsock 库文件?>Ws2_32.lib。使用 Winsock 的应用程序必须与 Ws2_32.lib >library 文件链接。 #pragma 注释向链接器指示需要 Ws2_32.lib >文件。
但是为什么我使用它而不是简单地加载 Windows Ws2_32.dll 中的现有文件(根据 MSDN https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recv 的要求,我理解 Windows 2003 以来)
所以我可以使用这样的东西:
typedef int WSAAPI(WINAPI* recv_func)(SOCKET s, char *buf, int len, int flags);
HINSTANCE hGetProcIDDLL = LoadLibraryA("ws2_32.dll");
my_recv = (recv_func)GetProcAddress(hGetProcIDDLL, "recv");
或者我可以只使用 winsock2.h 头文件并使用 /MD 标志编译程序:
include <winsock2.h>
//#pragma comment(lib, "ws2_32.lib")
有可能吗?我是否可以像第一个示例一样使用 /MD 或动态加载 ws2_32.dll 而无需将 ws2_32.lib 静态链接到我的应用程序,因为自 Win2003 以来的所有 Windows 在 System32 文件夹中都有 ws2_32.dll 吗?
【问题讨论】:
-
/MD此处无关。如果您需要使用 ws2_32.lib 中的函数,您需要以某种方式获取它的指针。可以通过导入它(使用与 lib 的链接)或自己解决它来完成。但是第二个,什么时候加载器可以为你做呢?
标签: c++ c winapi winsock winsock2