关于windows iocp的一个问题

时间:2009-05-06 16:58:05

标签: c++ windows visual-c++ iocp

当我在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);
    }


}

1 个答案:

答案 0 :(得分:3)

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

  

在结构用于函数调用之前,应始终将此结构的任何未使用的成员初始化为零。否则,该函数可能会失败并返回ERROR_INVALID_PARAMETER。

Globals初始化为零,而本地人则不是。如果您打算使用以前的代码,则需要将内存清零:

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