RegisterClassEx tut irgendwie nicht...
-
Hi, kann mir jemand sagen was ich falsch mache? Ich bekomme von einem GetLastError den Fehlercode 87.
Kann das evtl am hInstance liegen? Da steht bei mir eine NULL drin, bzw das CreateWindow liefert NULL.//--------------------------------------------------------------------------- #include <Windows.h> #include <Messages.hpp> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int iLeft = 100; int iTop = 100; int iWidth = 300; int iHeight = 200; char cClassName[] = "TCm_miso1"; HINSTANCE hInstance=0; LRESULT __stdcall WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ LRESULT Result = 0; HWND ID_OK; switch(uMsg){ case(WM_CREATE):{ ID_OK = CreateWindow("BUTTON", "OK-Button", WS_VISIBLE | WS_CHILD, 100, 100, 100, 30, hWnd, 0, hInstance, NULL); if(ID_OK == INVALID_HANDLE_VALUE) MessageBox(hWnd, "Button nicht erzeugt", "Meldung", 0); } case(WM_DESTROY): PostQuitMessage(0); case(WM_COMMAND):{ if(HIWORD(wParam) == BN_CLICKED) if(LOWORD(wParam) == (WPARAM)ID_OK) MessageBox(hWnd, "OK Button gedrückt", "Meldung", 0); } default: Result = DefWindowProc(hWnd, uMsg, wParam, lParam); } return(Result); } int main(int argc, char* argv[]) { MSG msg; TRect rect; int deskh, deskw; NONCLIENTMETRICS ncm; HANDLE hWnd; WNDCLASSEX wc; hInstance=GetModuleHandle(NULL); //NACHTRÄGLICH EDITIERT SetLastError(0); wc.cbSize = sizeof(wc); // size of structure wc.style = CS_HREDRAW |CS_VREDRAW;// redraw if size changes wc.lpfnWndProc = &WndProc; // points to window procedure wc.cbClsExtra = 0; // no extra class memory wc.cbWndExtra = 0; // no extra window memory wc.hInstance = hInstance; // handle to instance wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);// predefined app. icon wc.hCursor = LoadCursor(NULL,IDC_ARROW);// predefined arrow wc.hbrBackground = GetStockObject(WHITE_BRUSH);// white background brush wc.lpszMenuName = "MainMenu"; // name of menu resource wc.lpszClassName = "MainWClass"; // name of window class SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0); deskw = rect.Right - rect.Left; deskh = rect.Bottom - rect.Top; ncm.cbSize = sizeof(ncm); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0); iWidth = iLeft + iWidth; iHeight = iTop + iHeight + ncm.iMenuHeight + ncm.iCaptionHeight; iLeft = (deskw / 2) - (iHeight / 2); iTop = (deskh / 2) - (iHeight / 2); if(!RegisterClassEx(&wc)) return(GetLastError()); hWnd = CreateWindow( "MainWClass", // name of window class "Sample", // title-bar string WS_OVERLAPPEDWINDOW, // top-level window CW_USEDEFAULT, // default horizontal position CW_USEDEFAULT, // default vertical position CW_USEDEFAULT, // default width CW_USEDEFAULT, // default height (HWND) NULL, // no owner window (HMENU) NULL, // use class menu hInstance, // handle to application instance (LPVOID) NULL); // no window-creation data if(!hWnd)return(GetLastError()); while(1){ if(!GetMessage(&msg, 0, 0, 0)) break; //oops :o) TranslateMessage(&msg); DispatchMessage(&msg); } return(GetLastError()); } //---------------------------------------------------------------------------Freundlichen Gruss
Michael
-
du überprüfst ja noch nicht mal den rückgabewert.

-
Rückgabewert von RegisterClassEx ist "0"
-
hInstance = GetModuleHandle(NULL);
-
Habe das jetzt eingebaut und bekomme an folgender Stelle den Fehler 87.
RegisterClassEx(&wc); HRESULT res=GetLastError();Gruss
Michael
-
Du hast zum Beispiel hIconSm nicht angegeben und da du deine WNDCLASSEX-Struktur nicht vorher geleert hast, enthält dieser Member einen undefinierten, zufälligen Wert. Also entweder mit ZeroMemory(&wc,sizeof(WNDCLASSEX)) den Speicher leeren oder alle unbenutzten Member auf 0 setzen.
-
Das wars, danke euch..
Grüsse Michael