当我在Windows Vista中编写有关IO完成端口的程序时,
第一个示例不起作用,并且GetQueuedCompletionStatus()无法获得
任何重叠的结构。

因此,我将OVERLAPPED结构置于全局范围内,并且效果惊人。
这是为什么?

CODE1:

int main()
{
    OVERLAPPED o;
    ..
    CreateIoCompletionPort(....);

    for (int i = 0; i<10; i++)
    {
        WriteFile(..,&o);

        OVERLAPPED* po;
        GetQueuedCompletionStatus(..,&po);
    }


}

CODE2:
OVERLAPPED o;

int main()
{

    ..
    CreateIoCompletionPort(....);

    for (int i = 0; i<10; i++)
    {
        WriteFile(..,&o);

        OVERLAPPED* po;
        GetQueuedCompletionStatus(..,&po);
    }


}

最佳答案

好的!这来自OVERLAPPED结构的MSDN页面的“备注”部分:



全局变量为零,而局部变量不是。如果打算使用以前的代码,则需要将内存清零:

int main() {
    OVERLAPPED o = {0};
    // ...

10-08 15:24