2009-05-06 14 views
2

Windows VistaでIO完了ポートに関するプログラムを作成すると、 最初のサンプルは機能せず、GetQueuedCompletionStatus()はオーバーラップされた構造体 を取得できません。Windowsに関する質問iocp

私はグローバルスコープにオーバーラップした構造を置いて、それは驚くほどうまく機能します。 なぜですか?

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

いつか私の投稿を編集して戻しました。もう一度見たいかもしれません。 – dirkgently

答えて

3

大丈夫!構造は、関数呼び出しで使用される前に、この構造体の

未使用のメンバーは常にゼロに初期化する必要があります。これはOVERLAPPED構造のMSDNページの備考セクションからです。それ以外の場合、関数は失敗し、ERROR_INVALID_PARAMETERを返します。

グローバルはゼロに初期化されますが、ローカルはゼロです。以前のコードを使用する場合は、メモリをゼロにする必要があります。

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

前のプログラムでは、GetQueuedCompletionStatus()は時間がなくなるまでそこで待機します。 GetLastError()を呼び出す方法がないようです。 – Kim