2012-01-08 35 views
2

VC++コンパイラとVisual Studioを使用して、Win32 APIを使用して簡単なウィンドウを開こうとしています。私はクラスが失敗する理由を知りたいです。私はポインタなしでそれを割り当てることと、それをポインタとして割り当てて関数として参照として送信しようとしました。しかし、何を試しても、RegisterClassEx関数は真を返すことを拒否します。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

エラーコードは、おそらくERROR_INVALID_PARAMETERです。 –

答えて

6

WinMainからあなたのWNDCLASSEX構造がcbSize部材内に充填することにより、どのように大規模なWindowsを伝える必要があります。 RegisterClassExを呼び出す前にこのメンバーを初期化できませんでした。おそらくその機能が失敗しています。 sizeofオペレーターだけが必要です。

また、lpszMenuNameのように、構造体の他のメンバーの一部を初期化できませんでした。明示的に初期化しないと、ガベージ・データが含まれているため、おそらくRegisterClassEx関数が失敗する可能性があります。あなたがそれらを使用していない場合は、明示的RegisterClassEx引数は、ような構造を作成に持っていることを意味するものではありませんWNDCLASSEX構造体へのポインタを受け入れるという理由だけで、さらに0

にそれらを設定する必要がありますポインタ。スタック上に通常のオブジェクトを作成し、アドレス演算子(&)を使用して関数へのポインタを渡すことができます。

the documentationのように、RegisterClassEx関数を呼び出すときの詳細については、GetLastError functionを呼び出して詳細を確認することもできます。これにより、問題が発生したときに問題をデバッグするのに役立ちます。サンプルコードの作業

:あなたはWNDCLASSEXのすべてのメンバーを初期化していないので、

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; 
} 
関連する問題