2012-01-08 3 views
2

VC++ 컴파일러와 Visual Studio를 사용하여 Win32 API를 통해 간단한 창을 열려고합니다. 왜 수업이 실패하는지 알고 싶습니다. 나는 그것을 포인터로 할당하고 참조로 함수에 보내는 것과 함께 포인터없이 할당하려고 시도했다. 그러나 무엇을 시도하든, RegisterClassEx 함수는 true를 반환하는 것을 거부합니다.Win32 API - RegisterClassEx 오류

왜 그런가요?

WNDCLASSEX* wc = new WNDCLASSEX; 
    HWND hwnd; 
    MSG  msg; 
    bool done; 

    wc->style = CS_HREDRAW | CS_VREDRAW; 
    wc->lpfnWndProc = WndProc; 
    wc->cbClsExtra = 0; 
    wc->cbWndExtra = 0; 
    wc->hInstance = hInstance; 
    wc->hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc->hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc->hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
    wc->lpszClassName = L"someclass"; 

    if (!RegisterClassEx(wc)) { 
     MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION); 
     return 0; 
    } 
+2

오류 코드는 WNDCLASSEX의 모든 멤버를 초기화하지 않았기 때문에 아마 ERROR_INVALID_PARAMETER입니다. –

답변

6

WinMain에서 당신은 당신의 WNDCLASSEX 구조가 cbSize 회원을 작성하여 얼마나 많은 윈도우에게 있습니다. RegisterClassEx으로 전화하기 전에이 회원을 초기화하지 못했는데 아마도 그 기능이 실패하는 것 같습니다. sizeof 연산자 만 있으면됩니다.

lpszMenuName과 같이 구조의 다른 멤버 중 일부를 초기화하지 못했습니다. 명시 적으로 초기화하지 않으면 가비지 데이터가 포함되어서 RegisterClassEx 함수가 실패 할 가능성이 있습니다. 당신이 그들을 사용하지 않는 경우, 당신은 명시 적으로 RegisterClassEx 인수 당신이 같은 구조을 만들 한다는 것을 의미하지 않는 WNDCLASSEX 구조에 대한 포인터를 수용해서, 또한 0

로 설정해야합니다 바늘. 스택에 일반 객체를 만들고 주소 연산자 (&)를 사용하여 함수에 대한 포인터를 전달할 수 있습니다.

the documentation에 따라 RegisterClassEx 기능을 호출 할 때 잘못된 내용에 대해 자세히 알아 보려면 GetLastError function으로 전화 할 수 있습니다. 이렇게하면 문제가 발생할 때 디버깅하는 데 도움이됩니다.

근무 샘플 코드 :

WNDCLASSEX wc = {0}; // make sure all the members are zero-ed out to start 
wc.cbSize  = sizeof(wc); 
wc.style   = CS_HREDRAW | CS_VREDRAW; 
wc.lpfnWndProc = WndProc; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
wc.lpszClassName = L"someclass"; 

if (!RegisterClassEx(&wc)) { 
    MessageBox(NULL, L"Class registration has failed!", 
       L"Error!", MB_OK | MB_ICONERROR); 
    return 0; 
}