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


Anmelden zum Antworten