2009-05-06 2 views
2

Windows Vista에서 입출력 완료 포트에 관한 프로그램을 작성하면 첫 번째 샘플이 작동하지 않고 GetQueuedCompletionStatus()가 OVERLAPPED 구조체 을 얻을 수 없습니다.윈도우에 대한 질문 iocp

그래서 전역 범위에 OVERLAPPED 구조를 넣었으며 놀랍도록 작동합니다. 왜 그럴까요?

코드 1 :

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

좋아! 구조가 함수 호출에 사용하기 전에이 구조체의

사용하지 않은 회원은 항상 0으로 초기화한다 :이 OVERLAPPED 구조의 MSDN 페이지의 설명 부분에서입니다. 그렇지 않으면 함수가 실패하고 ERROR_INVALID_PARAMETER를 반환합니다.

지역은 그렇지 않은 반면 전역은 0으로 초기화됩니다. 이전 코드를 사용하려는 경우 메모리를 0으로 설정해야합니다.

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

이전 프로그램에서는 GetQueuedCompletionStatus()가 시간이 끝날 때까지 기다렸습니다. GetLastError()를 호출 할 수있는 방법이없는 것 같습니다. – Kim