CreateWindowEx aus dll



  • hi
    ich versuche einen fenster aus ner dll zu öffnen

    void createW(void* pParams){
    
    	const char g_szClassName [] = "My Window Class";
    	HINSTANCE hThisInstance = GetModuleHandle(NULL);
    
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = (LPCWSTR)g_szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        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 = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
    	{
    		MessageBoxA(NULL , "Failed to register window class" ,
                            "Error" , MB_ICONEXCLAMATION | MB_OK );
     	        return;
    
    	}
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowExA (
               0,                   /* Extended possibilites for variation */
               g_szClassName,         /* Classname */
               "MyWindow",       /* Title Text */
               WS_POPUP| WS_BORDER, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               420,                 /* The programs width */
               250,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, SW_SHOW);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
    }
    

    mein Fenster wird jedoch nicht angezeigt.
    wo is der Fehler?


  • Mod

    Meines Erachtens nach, hat HWND_DESKTOP nichts bei CreateWindow zu suchen!

    Was sagt den Spy++?
    Wird das Fensterwirklcih erzeugt? Du hast keinen Code der darauf reagiert, wenn das Fenster nicht erzeugt werden kann.

    HINSTANCE sollte Deine DLL Istanz sein, die Du mit dem DllMain Aufruf erhälst. Nicht GetModuleHandle(NULL), spirch das HINSTANCE der Applikation.



  • Eine DLL wird durch die Einbindung (erfolgt mit dem 1. Aufruf einer DLL-Funktion) Teil der Anwendung. Also: in der Anwendung hInstance etc. als globale Grössen festhalten, dann dort benutzen wie gehabt. Mache eine DLL-Funktion InitMyApplication() oder so und installiere dort den Aufruf des gewünschten Fensters. DllMain() kann dann leer bleiben.



  • berniebutt schrieb:

    Eine DLL wird durch die Einbindung (erfolgt mit dem 1. Aufruf einer DLL-Funktion) Teil der Anwendung.


  • Mod

    berniebutt schrieb:

    Eine DLL wird durch die Einbindung (erfolgt mit dem 1. Aufruf einer DLL-Funktion) Teil der Anwendung. Also: in der Anwendung hInstance etc. als globale Grössen festhalten, dann dort benutzen wie gehabt. Mache eine DLL-Funktion InitMyApplication() oder so und installiere dort den Aufruf des gewünschten Fensters. DllMain() kann dann leer bleiben.

    Du weist offensichtlich nicht wie RegisterClass funktioniert...
    http://blog.m-ri.de/index.php/2007/12/12/die-unsitte-immer-getmodulehandlenull-fuer-hinstance-in-createwindow-und-registerclass-zu-verwenden/



  • auch wenn ich HINSTANCE von meiner dll benutze, passiert nichts
    und HWND_DESKTOP hat bei mir immer funktioniert
    😞


  • Mod

    Wird ein HWND returniert? Was sagt GetLastError?
    Wo wird die DLL geladen? In einen Service?



  • Entschuldigung, habe mich schlecht oder unvollständig ausgesdrückt. "Global" soll heissen "für alle Prozesse / Instanzen global" (ref. Petzold). Geht leider nicht mit allen Compilern. Was immer geht, ist der Austausch zwischen Applikation und DLL-Funktionen über die Parameterliste. Habe das im Sinne der Frage ausprobiert, es geht einwandfrei!



  • Guten Tag,
    es tut mir leid wenn ich den alten beitrag nochmal raushole.
    Doch ich verzweifle langsam. Ich kriege einfach kein Fenster per DLL Inject hin, egal ob mit Hooked funktion oder originalen. mainhWnd bleibt immer 0

    void InitAll(HINSTANCE myInstance)
    {
        WNDCLASS wc={0};
    	wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
    	wc.lpfnWndProc=WndProc;
    	wc.hInstance=myInstance;
    	wc.lpszClassName=(LPCWSTR)CLASS_NAME;
    
    	wc.hCursor=(HCURSOR)LoadCursor(wc.hInstance,IDC_ARROW );
    	wc.hbrBackground=0;//(HBRUSH)GetStockObject(BLACK_BRUSH);
    	if(!RegisterClass( &wc ))
    	{
    		MessageBoxA(NULL,"Fehler 1","",MB_OK);
    		return;
    	}
    	mainhWnd=CreateWindowEx_o(
    			0,
    			TEXT("Philip"), // rest are same old.
    			TEXT("OOOOOOOOOOOOOOOOH!!! GHOSTLY WINDOW!!"),
    			WS_POPUP| WS_BORDER | WS_VISIBLE,
    			10, 10,
    			400, 400,
    			HWND_DESKTOP, NULL,
    			wc.hInstance, NULL );
    	if(!mainhWnd)
    	{
    		MessageBoxA(NULL,"Fehler 2","",MB_OK);
    		return;
    	}
    
        ShowWindow(mainhWnd, SW_SHOWDEFAULT);
        UpdateWindow(mainhWnd);
    
    }
    
    DWORD WINAPI ThreadRender( LPVOID lpParam ) 
    { 
    	InitAll((HINSTANCE)lpParam);
    
    hThread=CreateThread(NULL,0,ThreadRender,(HINSTANCE)hInstance,0,NULL);
    

    ich Hoffe jemand weiss eine lösung, denn ich arbeite schon seit mehreren Tagen daran und Google liefert auch nichts (Durch google bin ich hier gelandet)


Anmelden zum Antworten