2012-01-05 7 views
0

GetMessage() 루프가 끝난 후 어떤 이유로 "잘못된 창 핸들"오류가 발생하지만 HWND를 전달하지 않아도이 오류가 발생합니다. :이 응용 프로그램보다 더 많은에서 사용이 오류가 발생하지 않는 한 그것은 ShowError 잘못 아무것도 아니다GetMessage() 루프 이후에 잘못된 창 핸들

MSG Message; 
while(GetMessage(&Message, NULL, 0, 0) != 0) 
{ 
    TranslateMessage(&Message); 
    DispatchMessage(&Message); 
} 
ShowError(); 

) 때

void ShowError() 
{ 
    DWORD ErrorCode = GetLastError(); 
    if(ErrorCode == ERROR_SUCCESS) return; 

    LPTSTR lpszBuffer = NULL; 
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpszBuffer, 0, NULL); 

    MessageBox(NULL, lpszBuffer, NULL, MB_OK | MB_ICONERROR); 
    LocalFree(lpszBuffer); 
} 

답변

3

당신은 오직 GetLastError를 (호출해야 ...이야 Windows 함수가 실패 코드를 리턴했습니다. 이것은 스 니펫에서는 확실하지 않습니다.! = 0에 대한 GetMessage() 반환 값만 테스트합니다. 0 일 수 있습니다. 이는 프로그램이 WM_QUIT로 정상적으로 중지되었음을 나타냅니다. 또는 -1 일 수 있습니다. 실제 오류입니다.

0

나는 지금 막 동일한 과실이 나의 원인 및 해결책이기 때문에.


원인 : WndProc이이 오류의 원인 일 수 있습니다. 창을 닫을 때 DefWindowProc 함수는 마지막 오류를 1400 = 으로 설정합니다. PostQuitMessage을 "올바르게"사용하지 않으면 잘못된 창 핸들이 처리됩니다. 이 오류가 발생할 때 처리되는 메시지는 아마도 WM_NCLBUTTONDOWN입니다. 창이 파괴 된 경우 클릭이 처리 될 수 없습니다. 사실 창에는 처리 할 수없는 몇 가지 메시지가 있습니다.
PostQuitMessage 이후 DefWindowProc! 결과 코드를 반환하고 WndProc을 종료하십시오.

// translated from C# 
LRESULT WndProc(HWND window, int msg, WPARAM wParam, LPARAM lParam) 
{ 
    if (msg == WM_CLOSE) 
    { 
     PostQuitMessage(0); 
     return 0; // comment this line to get the error again 
    } 
    return DefWindowProc(window, msg, wParam, lParam); 
}