C++ IOCP无法在x64平台上运行

C++ IOCP无法在x64平台上运行,c++,64-bit,iocp,C++,64 Bit,Iocp,我在x64平台中使用IOCP时遇到了一个问题 当我在win32平台上编译代码时,它运行得很好。但当我将其更改为x64平台时,功能 GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,(PULONG_PTR)&PerHandleData, (LPOVERLAPPED*)&IpOverlapped, INFINITE) 返回true,但不将值传递给PerHandleData PerHandleData的定义

我在x64平台中使用IOCP时遇到了一个问题

当我在win32平台上编译代码时,它运行得很好。但当我将其更改为x64平台时,功能

GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,(PULONG_PTR)&PerHandleData, (LPOVERLAPPED*)&IpOverlapped, INFINITE)
返回true,但不将值传递给PerHandleData

PerHandleData的定义如下:

typedef struct
{
SOCKET socket;
SOCKADDR_STORAGE ClientAddr;
}PER_HANDLE_DATA,*LPPER_HANDLE_DATA;
LPPER_HANDLE_DATA PerHandleData;
这意味着,即使函数GetQueuedCompletionStatus()似乎没有错误,struct PerHandleData也无法读取内存:socket无法读取内存,ClientAddress也无法读取内存。没有价值

因此,当它运行到函数WSARecv(PerHandleData->socket,&(PerIoData->databuff),1,&RecvBytes,&Flags,&(PerIoData->overlapped),NULL);应用程序将因内存错误而停止


谁能告诉我如何处理它?

CreateIoCompletionPort的文档告诉我们密钥来自何处;在将其与
GetQueuedCompletionStatus
一起使用之前,需要将密钥传递到
CreateIoCompletionPort


CreateIoCompletionPort
的文档还指出,每个文件句柄的密钥应该是唯一的。(不仅仅是每个文件)


因此,由于我们没有实际的代码,这两个需求是主要的疑点。一个特殊的挑战可能是完成键上的间接寻址级别。将键传递给
CreateIoCompletionPort
,并将指向键的指针传递给
GetQueuedCompletionStatus
(因此它将把键放在指向的位置-这是一个OUT参数)。这个键可能是指针本身

我遇到了同样的问题,问题是在32位中,我只是将完成键转换为
DWORD
并将其传递给
CreateIoCompletionPort
调用。在64位应用程序中,它仍然可以构建,只是一个编译器警告。更改代码并转换为
ULONG\u PTR
将解决此问题。compler警告只是告诉原因:
数据被截断了
。当点地址大于32位时,
GetQueuedCompletionStatus
将获得截断的地址,仅为32位。

我们需要查看更多代码。