C++ 使用GetQueuedCompletionStatusEx退出多个完成的队列

C++ 使用GetQueuedCompletionStatusEx退出多个完成的队列,c++,winapi,C++,Winapi,我正试图使用从I/O完成端口IOCP中退出多个完成 void GetPackets() { OVERLAPPED_ENTRY pEntries; ULONG NumEntries; if (!GetQueuedCompletionStatusEx(PointIOCP, &pEntries, PENDING_RECVS, &NumEntries, 0, false)) { printf("Get Queued Completion Statu

我正试图使用从I/O完成端口IOCP中退出多个完成

void GetPackets() {
    OVERLAPPED_ENTRY pEntries;
    ULONG NumEntries;
    if (!GetQueuedCompletionStatusEx(PointIOCP, &pEntries, PENDING_RECVS, &NumEntries, 0, false)) {
        printf("Get Queued Completion Status - Point Error: %i\n", GetLastError());
        return;
    }

    if (NumEntries = 0) { return; }

    printf("Got Entries!\n");
    for (unsigned int i = 0; i < NumEntries; i++) {
        NetPacket_Recv* Packet = reinterpret_cast<NetPacket_Recv*>(pEntries[i].lpOverlapped);
    }
}
错误与pEntries[i]有关。LPO重叠。编译器告诉我重叠的_项不存在[]运算符。根据文档,pEntries应该接收一系列重叠的_条目结构

lpCompletionPortEntries:接收包含条目的重叠的_条目结构数组

当我定义pEntries时,我只声明了重叠_条目的一个实例。如何将pEntries定义为指向重叠项数组的指针?

您从中引用,但您似乎错过了引用片段上方的重要部分:

lpCompletionPortEntries[输出]

在输入时,指向一个预先分配的重叠_条目结构数组

在输出时,接收一个包含这些项的重叠_项结构数组。数组元素的数量由ulNumEntriesRemoved提供

重叠的_入口五通;声明单个重叠的_项,而不是重叠的_项元素数组。这就是为什么pEntries[i]不起作用的原因,因为pEntries不是数组,甚至不是指针

将&pEntries传递给函数时,传递的是指向1个重叠\u项的指针,但设置的是指向未决\u RECVS的ulCount指针,因此函数希望传递指向数组的指针,数组中至少包含若干重叠\u项元素。除非PENDING_RECVS为1,否则您不会这样做

此外,NumEntries=0是赋值,而不是比较。你应该得到编译器的警告。您需要使用运算符==而不是运算符=

请尝试类似以下内容:

无效获取数据包{ 重叠输入项[待定记录]; ULONG NumEntries=0; if!GetQueuedCompletionStatusExPointIOCP,条目,挂起记录(&N),0,FALSE{ printfGet排队完成状态-点错误:%u\n,GetLastError; 回来 } 如果NumEntries==0{return;} printfGot条目!\n; 对于ULONG i=0;i
OVERLAPPED_ENTRY entries[10];
或者您希望返回的其他最大值,就像任何其他数组一样。并将实例数作为第三个参数传递给GetQueuedCompletionStatusEx。注意我是如何更改变量名的,因为它实际上不是指针。函数参数是指针,但数组变量不是。

谢谢,注意==也。它现在正在按预期工作。我假设我可以传入一个正确类型的空指针,函数会将我的指针设置为某个内部初始化变量。谢谢。@KKlouzal我假设我可以传入一个正确类型的空指针,而函数会将我的指针设置为某个内部初始化变量-你的假设是错误的。文档中没有任何内容声称传入空指针是有效的。这样做也没有意义。代码中也没有使用任何空指针