[WinAPI & C++] RegisterClassEx-Error 87

ComFreek

Mod | @comfreek
Moderator
Hallo an alle,

ich habe mal wieder ein Problem. Und zwar entwerfe ich gerade eine Klasse, die alle Aktionen mit einem Fenster regelt (ich weiß, es gibt bereits solche Klasse).
Nun scheitere ich bei RegisterClassEx. GetLastError() hat den Fehlercode 87 ausgegeben und in der MSDN steht, dass es an einem ungültigen Parameter liegt.
Ich bin aber im Code schon 20-mal durchgegangen!
C++:
TWindow::TWindow(HINSTANCE _hInstance) // Initialisierung der Klasse, der Parameter _hInstance ist der gleiche wie bei WinMain(...HINSTANCE hThisInstance)
{
    this->hInstance = _hInstance;
    this->Icon = LoadIcon (NULL, IDI_APPLICATION);
    this->IconSmall = LoadIcon (NULL, IDI_APPLICATION);
    this->Cursor = LoadCursor (NULL, IDC_ARROW);
    this->Background = (HBRUSH) COLOR_BACKGROUND;
    this->MenuName = NULL;
    this->ClassName = "CodeBlocksWindowsApp";
}
void TWindow::FillWinCl()  // WNDCLASSEX-Struktur füllen
{
    ::ZeroMemory(&this->WinCl,sizeof(this->WinCl));  // Eventuellen "Müll rausschmeißen"
    this->WinCl.cbSize = sizeof(WNDCLASSEX);
    this->WinCl.style = CS_DBLCLKS;
    this->WinCl.lpfnWndProc = this->WndProc;  // Wird in einer anderen Funktion gesetzt!
    this->WinCl.cbClsExtra = 0;
    this->WinCl.cbWndExtra = 0;
    this->WinCl.hInstance = this->hInstance;
    this->WinCl.hIcon = this->Icon;
    this->WinCl.hIconSm = this->IconSmall;
    this->WinCl.hCursor = this->Cursor;
    this->WinCl.hbrBackground = this->Background;
    this->WinCl.lpszMenuName = this->MenuName;
    this->WinCl.lpszClassName = this->ClassName;
}

Ich hoffe mir kann jemand helfen. Ich bedanke mich sehr bei jedem, der mir wenigstens einen Tipp gibt!!
//EDIT: Ich benutze Code::Blocks mit GNU GCC Compiler
Vielleicht wär zu erwähnen, dass ich die beiden Funktionen direkt am Anfang der WinMain aufrufe
 
Zuletzt bearbeitet:
Konnte zwar keine Fehler finden, aber probier mal mit einer Funktion:
C++:
TWindow::TWindow(HINSTANCE hThisInstance) 
{
this->WinCl.cbSize = sizeof (WNDCLASSEX);
this->WinCl.style = CS_DBLCLKS;
this->WinCl.lpfnWndProc = WndProc; 
this->WinCl.cbClsExtra = 0;              
this->WinCl.cbWndExtra = 0;
this->WinCl.hInstance = hThisInstance;
this->WinCl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
this->WinCl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
this->WinCl.hCursor = LoadCursor (NULL, IDC_ARROW);
this->WinCl.lpszClassName = "CodeBlocksWindowsApp";
this->WinCl.lpszMenuName = NULL;                 
this->WinCl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&WinCl)) return -1;
else return 0;
}
Falls es nicht geht, kann ich nicht helfen:(
 
Zuletzt bearbeitet von einem Moderator:
Ich seh nur eine Kleinigkeit, wenn du Farb-Konstanten als HBRUSH einsetzen willst, dann musst du eins draufzählen:

this->Background = (HBRUSH)( COLOR_BACKGROUND + 1 );
 
Danke für die Antworten.
Das Komische ist, wenn ich den Teil direkt in WinMain packe, dann funktioniert es!
this->Background = (HBRUSH)( COLOR_BACKGROUND + 1 );
Habe ich ausprobiert, daran liegt es nicht.

Ich habe es jetzt mal, wie Brunlorenz geschrieben hat, ausprobiert und zwar kommt der Fehlercode 2 ==> Laut MSDN "The system cannot find the file specified."
Welche Datei?

EDIT: Es wird aber kein Fehler mehr per "throw" ausgelöst, es steht nur was in GetLastError().
 
Zuletzt bearbeitet:
Du musst es wahrscheinlich in die WinMain packen, da er irgendwas da drin benötigt. Ich erstelle immer
alle Klassen in der WinMain und habe demensprechend auch keine Probleme :)
Ich frage mich allerdings, wiso das was du geschrieben hast, nicht geht :confused:
PS: Kannst du mir mal den Rückgabewert meiner Funktion sagen (-1 oder 0)?
 
Zuletzt bearbeitet:
Was den Fehlercode angeht: Ich meine, dass du bei Programmstart den Fehlercode erst zurücksetzen musst. Versuch mal ganz am Anfang deiner WinMain folgenden Code:
C++:
SetLastError(0); //0 == ERROR_SUCCESS =>Zurücksetzen der Systemerrors
. Nun schau mal, ob immer noch Fehlercode 2 kommt.


mfg
kickerxy
 
@brunlorenz:
Es kommt -1 raus.
Du musst es wahrscheinlich in die WinMain packen, da er irgendwas da drin benötigt. Ich erstelle immer
alle Klassen in der WinMain und habe demensprechend auch keine Probleme
Du hast mich falsch verstanden. Ich erstelle ein Objekt der Klasse in WinMain, nur die ganzen Funktionen sind in der Klasse deklariert (=außerhalb) und das ändert irgendwas.

@kickerxy123
Ich merke optisch, dass die Funktion fehlgeschlagen hat, denn es öffnet sich kein Fenster.

In der MSDN habe ich ein Codebeispiel gefunden. Da wird das Fenster in einer "freien" (=nicht in einer Klasse) Funktion erstellt:
C++:
bool InitWindow()
  {
      HWND hwnd;    
      WNDCLASSEX wincl; 

      /* The Window structure */
      wincl.hInstance = MainInstance;
      wincl.lpszClassName = szClassName;
      wincl.lpfnWndProc = WindowProcedure; 
      wincl.style = CS_DBLCLKS;         
      wincl.cbSize = sizeof (WNDCLASSEX);

      /* Use default icon and mouse-pointer */
      wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
      wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
      wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
      wincl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);          
      wincl.cbClsExtra = 0;               
      wincl.cbWndExtra = 0;                      
      wincl.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

      /* Register the window class, and if it fails quit the program */
      if (!RegisterClassEx (&wincl))
          return false;
      
     // ...Fenster-Handle erzeugen
     MainHandle = hwnd;         // Handle an globale Variable übergeben
  }
Ich vermute, dass es eventuell an dem Gültigkeitsbereich der Variablen innerhalb der Klasse liegt (nur eine Vermutung).
 
Zuletzt bearbeitet:
@deepthroat:
Habe es gemacht.

Es passierte ein Wunder!!:D Es klappt, nur fragt sich was bei der vorherigen Version nicht geklappt hat.
An alle ein herzliches Dank!
Habe jetzt noch ein Problem: Wie setzt man die Hintergrundfarbe auf einen RGB-Wert (bzw. konvertiert man ein RGB() in HBRUSH)?
 
C++:
HBRUSH deinBrush = CreateSolidBrush(RGB(r,g,b));
Bezüglich BackgroundColor: such mal nach SetBkColor(); wenn ich mich recht erinnere.

mfg kickerxy
 

Neue Beiträge

Zurück