Einfaches Fenster konstruieren: HWND immer null
-
Notfalls gibts noch GetLastError, das wie in einem anderen Thread hier ersichtlich nicht immer irgendwas zurückgibt.
-
Mechanics schrieb:
Notfalls gibts noch GetLastError, das wie in einem anderen Thread hier ersichtlich nicht immer irgendwas zurückgibt.
GetLastError gibt 0 zurueck:
ich gebe derzeit alle msgs an DefWindowProc weiter
Meep Meep
-
Der Code sieht in Ordnung aus und dass GetLastError 0 zurückgibt, obwohl CreateWindow ein ungültiges Handle zurückgegeben hat, ist sehr merkwürdig.
Annahmen:
- die Resourcen können nicht geladen werden, weil die Instanzen sich unterscheiden
- der Klassen Name ist nicht gültig mit den :: / wurde intern umgewandelt
- der Grund liegt in Code, den du uns noch nicht gezeigt hast
-
Zeig uns mal Deine WndProc!
-
Meep Meep schrieb:
ich gebe derzeit alle msgs an DefWindowProc weiter
Meep Meep
Bei WM_CREATE sollte das man/frau aber nicht tun. Da sollte deine WindowProc einfach nur 0 zurückliefern.
mfg Martin
-
mgaeckler schrieb:
Meep Meep schrieb:
ich gebe derzeit alle msgs an DefWindowProc weiter
Meep Meep
Bei WM_CREATE sollte das man/frau aber nicht tun. Da sollte deine WindowProc einfach nur 0 zurückliefern.
mfg Martin
Und warum bitte nicht? DefWindowProc funktioniert auch dafür...
-
Martin Richter schrieb:
Und warum bitte nicht? DefWindowProc funktioniert auch dafür...
Ich hatte auch mal das gleiche Problem. Da habe ich herausgefunden, daß DefWindowProc nicht 0 zurückliefert. Normalerweise liefert man aber in seiner Fensterprozedur aber den Rückgabewert von DefWindowProc zurück.
Gut, wenn man das nicht so macht und den Rückgabewert von DefWindowProc verwirft, mag es funktionieren.
mfg Martin
-
Ich hab' noch nie
WM_CREATE
selbst behandelt.OK, ist gelogen, in meinen ~15 Jahren war fast sicher mal ein Fall dabei wo ich mich da einklinken musste. Aber dann auf jeden Fall so dass ich vor oder nach meinem eigenen Code die
DefWindowProc
aufgerufen hab.DefWindowProc
nicht aufrufen mach' ich nur wenn in der Doku steht dass man es nicht aufrufen soll.@Meep Meep
Wie Martin schon geschrieben hat: zeig uns mal deine Window-Proc.ps: die
HINST_THISCOMPONENT
Sache kommt mir komisch vor. Macht man das wirklich so? Ich hab' hier meistGetModuleHandleEx
verwendet, oder den Wert denWinMain/DllMain
mitgegeben bekommt irgendwo abgespeichert.
-
hustbaer schrieb:
ps: die
HINST_THISCOMPONENT
Sache kommt mir komisch vor. Macht man das wirklich so? Ich hab' hier meistGetModuleHandleEx
verwendet, oder den Wert denWinMain/DllMain
mitgegeben bekommt irgendwo abgespeichert.Unter Win32 ist die HINSTANCE einfach nur das Module Handle der exe. Das Module Handle wiederum, ist unter Win32 einfach nur die Base Address. Ich vermute mal, HINST_THISCOMPONENT ist einfach nur eine Konstante für
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
... );
-
Die Sache mit Instance Handle == Module Handle == Base-Address des PE Image ist mir durchaus bekannt.
Nur die__ImageBase
Sache kannte ich nicht.
-
Das stammt aus vertrauenswürdiger Quelle
http://blogs.msdn.com/b/oldnewthing/archive/2004/10/25/247180.aspxAlternativ geht auch:
HINSTANCE Get_hInstance() { MEMORY_BASIC_INFORMATION mbi; VirtualQuery(Get_hInstance, &mbi, sizeof(mbi)); return reinterpret_cast<HINSTANCE>(mbi.AllocationBase); }
-
Woher weißt du, dass dein Windowhandle 0 ist, prüfst du das irgendwo oder hast du das mal mit nem Debugger nachgeprüft??
Oder wird dein Fenster einfach nur nicht angezeigt??
Falls dein Fenster nur nicht angezeigt wird, probiers mal so:
Bei CreateWindow zusätzlich zu WS_OVERLAPPEDWINDOW noch das WS_VISIBLE flag setzen
[code="cpp"]HWND m_hwnd = CreateWindow(TEXT("txl::winapi::MessageWindow"), TEXT("MessageWindow"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 400, 400, 0, 0, HINST_THISCOMPONENT, this);[/code]