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