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


  • Mod

    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


  • Mod

    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 meist GetModuleHandleEx verwendet, oder den Wert den WinMain/DllMain mitgegeben bekommt irgendwo abgespeichert.



  • hustbaer schrieb:

    ps: die HINST_THISCOMPONENT Sache kommt mir komisch vor. Macht man das wirklich so? Ich hab' hier meist GetModuleHandleEx verwendet, oder den Wert den WinMain/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.


  • Mod

    Das stammt aus vertrauenswürdiger Quelle 😉
    http://blogs.msdn.com/b/oldnewthing/archive/2004/10/25/247180.aspx

    Alternativ 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]


Anmelden zum Antworten