2

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

所以我把 OVERLAPPED 结构放在全局范围内,它的效果非常好。这是为什么?

代码1:

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

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

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


}

代码2:

OVERLAPPED o;

int main()
{

    ..
    CreateIoCompletionPort(....);

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

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


}
4

1 回答 1

3

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

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

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

int main() {
    OVERLAPPED o = {0}; 
    // ...
于 2009-05-06T17:11:47.110 回答