当我在Windows Vista中编写有关IO完成端口的程序时, 第一个示例不起作用,并且 GetQueuedCompletionStatus() 无法获取 任何重叠的结构。
所以我将 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);
}
}
最佳答案
好的!这是来自OVERLAPPED结构的 MSDN 页面的备注部分:
Any unused members of this structure should always be initialized to zero before the structure is used in a function call. Otherwise, the function may fail and return ERROR_INVALID_PARAMETER.
全局变量是零初始化,而局部变量不是。如果您打算使用以前的代码,则需要将内存清零:
int main() {
OVERLAPPED o = {0};
// ...
关于c++ - 关于windows iocp的一个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/830639/