5

MSVC2010搭載のWindows7でConnectEx機能を使いたいです。

エラー C3861 が表示されます: 'ConnectEx': 識別子が見つかりません

MSDN は、関数を mswsock.h で宣言する必要があることを示唆していますが、チェックすると、そこで定義されていません。

任意のヒント?

4

1 に答える 1

10

あなたが言及したMSDNの記事をConnectEx()さらに読むと、次のように書かれています:

ConnectEx関数の関数ポインターは、 SIO_GET_EXTENSION_FUNCTION_POINTERオペコードを指定してWSAIoctl関数を 呼び出すことにより、実行時に取得する必要があります。WSAIoctl 関数に渡される入力バッファーには、 ConnectEx 拡張関数を識別するグローバル一意識別子 (GUID) であるWSAID_CONNECTEXが含まれている必要があります。成功すると、WSAIoctl関数によって返される出力には、 ConnectEx関数 へのポインターが含まれます。WSAID_CONNECTEX GUID は、Mswsock.h ヘッダー ファイルで定義されてます

他の Windows API 関数とは異なりConnectEx()、実行時にロードする必要があります。これは、ヘッダー ファイルに関数宣言が実際に含まれておらずConnectEx()( とtypedef呼ばれる関数の があります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 に答える