当我在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);
}
}
答案 0 :(得分:3)
好!这是来自OVERLAPPED结构的MSDN页面的备注部分:
在结构用于函数调用之前,应始终将此结构的任何未使用的成员初始化为零。否则,该函数可能会失败并返回ERROR_INVALID_PARAMETER。
Globals初始化为零,而本地人则不是。如果您打算使用以前的代码,则需要将内存清零:
int main() {
OVERLAPPED o = {0};
// ...