关于Windows iocp的问题

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

所以我把OVERLAPPED结构放在全局范围内,而且它的function非常强大。 这是为什么?

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页面的备注部分:

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

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

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