ActiveX, unsichtbares Fenster



  • Ich versuche, in einer dll eine ActiveX Komponente zu registrieren. - Dieser Teil läuft an sich ok (ich kann, wie gewünscht, einen webbrowser2 erzeugen), das Problem ist das Erzeugen eines Fensters.

    Wenn ich Microsoft folge,so ist der erste Punkt die Initialisierung der ATL, die etwa so ausschaut:

    #pragma comment(lib, "atl.lib")
    #include <atldef.h>
    #define _ATL_DLL_IMPL
    #include <atliface.h>
    
    1. Dann rufe ich die Funktion InitCommonControls auf:
    InitCommonControls();
     _Module.Init(0, m_hInstance);
     AtlAxWinInit();
    
     HWND hWnd = ::CreateWindow("AtlAxWin", "MSCAL.Calendar",
        WS_BORDER, 10, 10, 500, 300, NULL, NULL,
        ::GetModuleHandle(NULL), NULL);
    

    Dieser Aufruf freilich ergibt bei mir einen leeren WindowsHandler.
    Woran kann das liegen?

    Ps. All das ist hier beschrieben, hilft mir aber nicht recht weiter

    http://support.microsoft.com/kb/192560


  • Mod

    Was sagt GetLastError?



  • Die Antwort ist:

    ERROR_CANNOT_FIND_WND_CLASS

    was mich ein bisschen verwirrt. Heißt dies, dass man auch bei Einbinden eines ActiveX Controls eine Window Klasse definieren & registrieren muss?


  • Mod

    Fensterklasse ist nicht registriert.

    Du machst das in einer DLL, dann kann Dir ::GetModuleHandle(NULL) nurein falsches Handle liefern! Verwende bitte die korrekte hInstance, die Dir auch in DllMain mitgeteilt wurde.



  • Herzlichen Dank, Martin Richter. Da ist wohl der wunde Punkt berührt.
    Tatsächlich habe ich auch an dieser Frage herumlaboriert, aber auch das ergibt den FehlerCode 1407, also ERROR_CANNOT_FIND_WND_CLASS

    Hier jedenfalls liehgt ein Teil meiner Unsicherheit (ist halt das 1. Mal, dass ich ein Fenster aus einer dll heraus erzeugen will)

    static HINSTANCE g_hinstDLL;  // in einer Header Datei definiert
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {
    g_hinstDLL = HINSTANCE(hModule);  // diesen Cast habe ich eingefügt, weil ich 
                                      // gelesen habe, dass der Handle identisch ist
                                      // mit dem hInstance Wert
    return true;
    }
    

    Ich habe dies später ignoriert, weil ich gelesen habe, dass Windows 2000 + mHinstance völlig ignorieren.


  • Mod

    Percy2000 schrieb:

    Ich habe dies später ignoriert, weil ich gelesen habe, dass Windows 2000 + mHinstance völlig ignorieren.

    Wer hat so einen Quatsch geschrieben? Module Handle und Instance Handles haben wieterhin Bbedeutung...

    Fürchterlich ist einfach, dass immer wieder GetModuleHandle(NULL) blind empfohlen wird, wenn man ein HINSTANCE benötigt. Aber irgend jemand hat es mal in die Welt gesetzt und nun wird es als "Wahrheit" immer wieder kopiert.



  • Ist der Cast von Module zu hInstance so in Ordnung?
    Und wenn ja, woran kann's liegen, dass ich trotzdem die Fehlermeldung bekomme?

    Hier übrigens der Urheber:
    http://www.cpp-tutor.de/mfc/mfc/kap2/_intern/createwindowex.htm


Anmelden zum Antworten