5

我想用 MSVC2010 在 Windows7 上使用 ConnectEx 功能。

我收到错误 C3861:“ConnectEx”:找不到标识符

MSDN 建议该函数应该在 mswsock.h 中声明,但是,在检查它时,它并没有在那里定义。

有小费吗?

4

1 回答 1

10

如果您进一步阅读您提到的 MSDN 文章ConnectEx(),它会说:

注意ConnectEx函数的函数指针必须在运行时通过调用指定了SIO_GET_EXTENSION_FUNCTION_POINTER操作码的WSAIoctl函数来 获取。传递给 WSAIoctl 函数的输入缓冲区必须包含WSAID_CONNECTEX,这是一个全局唯一标识符 (GUID),其值标识ConnectEx 扩展函数。成功时, WSAIoctl函数返回的输出 包含一个指向ConnectEx函数的指针。WSAID_CONNECTEX GUID 在Mswsock.h头文件中定义。

与其他 Windows API 函数不同,ConnectEx()必须在运行时加载,因为头文件实际上不包含函数声明ConnectEx()(它确实有一个typedeffor 函数调用LPFN_CONNECTEX),并且文档没有特别提到您必须链接的特定库为了使它工作(通常是其他 Windows API 函数的情况)。

这是一个如何使它工作的示例(为说明省略了错误检查):

#include <Winsock2.h> // Must be included before Mswsock.h
#include <Mswsock.h>

// Required if you haven't specified this library for the linker yet
#pragma comment(lib, "Ws2_32.lib")

/* ... */

SOCKET s = /* ... */;
DWORD numBytes = 0;
GUID guid = WSAID_CONNECTEX;
LPFN_CONNECTEX ConnectExPtr = NULL;
int success = ::WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER,
    (void*)&guid, sizeof(guid), (void*)&ConnectExPtr, sizeof(ConnectExPtr),
    &numBytes, NULL, NULL);
// Check WSAGetLastError()!

/* ... */

// Assuming the pointer isn't NULL, you can call it with the correct parameters.
ConnectExPtr(s, name, namelen, lpSendBuffer,
    dwSendDataLength, lpdwBytesSent, lpOverlapped);
于 2012-06-10T09:43:30.180 回答