2013-03-01 3 views
3

저는 최근에 C++에서 Windows API를 사용하여 창 클래스를 만들려고했습니다. 그러나 ShowWindow를 호출 할 때마다이 함수는 마지막 오류를 1400 (ERROR_INVALID_WINDOW_HANDLE)로 설정합니다. 잠시 동안 시도 후, 나는 다음과 같은 예를 통해 발견 : http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx#commentsShowWindow invalid window handle

에도 새 프로젝트 (I 2008 MSVC Express를 사용)를 생성하고 (내가 싫어하는) 정확하게 코드를 복사, 내가 발견, 그 동안

int PASCAL 
WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int nShowCmd) 
{ 
g_hinst = hinst; 

if (SUCCEEDED(CoInitialize(NULL))) { 
    InitCommonControls(); 

    RootWindow *prw = RootWindow::Create(); 
    if (prw) { 
    ShowWindow(prw->GetHWND(), nShowCmd); 
    int error = GetLastError(); //Line added by me, error gets set to 1400. 
    MSG msg; 
     while (GetMessage(&msg, NULL, 0, 0)) { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 
    } 
    CoUninitialize(); 
} 
return 0; 
} 

(전체 코드는 위의 링크에서 확인하실 수 있습니다)

: 코드가 성공적으로 창을 생성의이 ShowWindow 함수를 여전히보고 여기에 오류 1400은 위의 링크에서 발견 된 코드에서 발췌 한 것입니다 누군가가 윈도우 변수를 멤버 변수로 처리하는 방법에 대한 아이디어가 있다면 ShowWindow에서 오류 1400을받지 않고 클래스를 작성한 경우, 도움을 많이 주시면 감사하겠습니다.

+0

이것은 사소한 것처럼 들릴지 모르지만 유효한 창 핸들로 설정되도록 GetHWND() 반환 값을 확인 했습니까? 만약 당신이 링크 한 코드 (정직하게 쓰여졌을 때 이미 구식이었고 시간이 아무런 도움이되지 않았다)은 WM_NCCREATE를 다음과 같이 처리하는 것에 달려있다. (예 :! :: IsWindow (prw-> GetHWND() 이 작업이 올바르게 수행되지 않았거나 오류가 발생하면 창 핸들이 유효하지 않습니다. – WhozCraig

+0

제안 된대로 코드를 추가하려고 시도했지만 IsWindow가 1을 반환하여 창 핸들을 나타냅니다. 기존 창을 식별합니다. [microsoft.com : IsWindow() 함수 참조] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633528%28v=vs.85%29.aspx) – Mmarss

답변

6
ShowWindow(prw->GetHWND(), nShowCmd); 
    int error = GetLastError(); 

이것은 올바른 코드가 아닙니다. GetLastError()를 호출하는 것이 유효한 유일한 시간은 winapi 함수 이 실패한 경우입니다 (). 이 아니었을 때 GetLastError()를 사용하면 완전히 임의의 수를 얻게됩니다. ShowWindow()는 전혀 오류 코드를 생성하지 않기 때문에 GetLastError()를 사용하면 이 아님이 정확합니다.

if (!SomeWinapiFunction(...)) { 
    int error = GetLastError(); 
    CrashAndBurn(error); 
} 

그러나 값이 오류를 표시하고 GetLastError 여부() 적절한 무엇인지 돌아 볼 수있는 MSDN 설명서를 확인합니까 :

일반적인 패턴

대략이다. 일반적으로 예를 들어 GDI 함수가 아닙니다. 코드의 다른 부분에서도이 문제를 해결해야합니다. 원시 API를 사용할 때 오류 처리 권한을 얻는 것이 중요합니다. 매우입니다. 특히 RootWindow :: Create() 메서드가 창을 만들지 못했음을 나타내는 좋은 방법이 없다는 점에 유의하십시오. 그것은 고정 될 필요가있다. 예외는 물론 그렇게하는 아주 좋은 방법입니다.

+0

+1 Hans, 나는 실수로 API가 실패했다고 추측했지만 실수로 그의 "문제"는 문제가 없다는 것을 알지 못했습니다. – WhozCraig

+0

많은 감사합니다. 성공적으로 완료되면 GetLastError를 통해 오류가 발생했음을보고합니까? – Mmarss

+0

다시 ** 오류를보고하지 않았습니다 **. TRUE를 반환했습니다. 오류가 없을 때 GetLastError()를 호출하면 임의의 숫자가 생깁니다. 그러나 암호로 안전한 임의의 숫자는 아닙니다. –