DllMain wird gar nicht aufgerufen :(

Akilein

Mitglied
Hi Leute!
Ich habe gestern sehr viel Zeit mit dlls verbracht, wollte bisschen rumprobieren, aber eines vestehe ich nicht ... in dem Buch was ich lese steht, dass jedes Mal wenn ein Programm die DLL braucht und sie geladen wird, die Funktion DllMain aufgerufen wird ... ich hab deshalb um das zu überprüfen eine Funktion MessageBox eingebaut und bin zum Entschluss gekommen, dass die Funktion gar nicht aufgerufen wird ... ich kann Funktionen exportieren und sie von einem anderen Programm aufrufen, aber DllMain wird trotzdem NIE aufgerufen, ist das normal? Oder war der Autor, wo er das Buch schrieb nicht mehr ganz nüchtern? :P

hier ist der Code vom Hauptprogramm:
Code:
#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
__declspec (dllimport) void Meldung(char *);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static char szAppName[]= "Progi";
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    
    wndclass.style= CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc= WndProc;
    wndclass.cbClsExtra= 0;
    wndclass.cbWndExtra= 0;
    wndclass.hInstance= hInstance;
    wndclass.hIcon= LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor= LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground= (HBRUSH) (COLOR_BTNFACE + 1);
    wndclass.lpszMenuName= NULL;
    wndclass.lpszClassName= szAppName;
    
    if(!RegisterClass(&wndclass))
    {
        MessageBox(NULL, "Fehler!", szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd= CreateWindow(szAppName, "Fenster Titel", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                       CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
                       
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{   
    switch(message)
    {     
       case WM_CREATE:
            Meldung("BLUB BLUB BLUB");
            return 0;
            
       case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
            
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}
und hier ist der Code von meiner DLL:
Code:
#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        MessageBox(NULL, "test", "test", NULL);
        break;
    }
    
    return TRUE;
}

__declspec (dllexport) void Meldung(char *text)
{
       MessageBox(NULL, text, "test", NULL);
}

würde mich freuen, wenn mir wer helfen könnte, so dass die Meldung "test auch automatisch beim Laden der Dll angezeigt wird... Danke!
 
Zuletzt bearbeitet:
die DllMain() wird grundsätzlich nur zweimal aufgerufen, nämlich wenn man die DLL läd... und wenn man sie wieder unloaded(mir fällt grad kein besseres wort ein, lol)..

[sie wird au noch andernweitig benutzt mit threads, aba davon hab ich kein plan]

man kann sie natürlich auch seperat aufrufen... aufjedenfall wird sie nicht mit aufgerufen, wenn du eine exportierte funktion aus der DLL aufrufst..
bei der funktion LoadLibraryEx() lässt sich glaub noch festlegen, das die DllMain() nicht beim laden aufgerufen wird..
und wie ich sehe ist die DLL bei dir statisch.. da bin ich mir nicht sicher ob die messagebox dann angezeigt wird... kannst ja mal LoadLibrary() versuchen, und schaun ob die messagebox kommt...

haut mich wenn ich lüge :)
 
danke für deine Anwort erstmal!
ja ich habs auch mit LoadLibrary probiert, die Meldung wird trotzdem nicht ausgegeben ... ich bin ganz verwirrt, ich dachte zu erst, ich mach nur etwas falsch, aber scheinbar ist das doch nicht so ne klare Sache, dass da was beim Laden aufgerufen wird, weiß nciht warum es im Buch so steht, ist das nun im Buch ein Blödsinn und wird bei DLLs nie eine Funktion automatisch aufgerufen oder wie? Würd gern die SAche abhacken und falls der Autor Mist schreibt das Buch wechseln ...

Bitte um Aufklärung :) DAnke!
 
Die DLLMain wird immer aufgerufen. Bei mir hats immer funktioniert.
Hast du schonmal einen Breakpoint in die DLL gesetzt? Dann siehst du, ob die DLLMain aufgerufen wird.
 
Bin nicht gerade fit bei DLL's. Aber ich denke, dass DLL nur Funktionen enthalten können und keine Befehle außerhalb von Funktionen.
 
@wieschoo
befehle auserhalb einer funktion? wie soll das denn ÜBERHAUPT gehn?

@flegmon
was meinst du mit "wird immer aufgerufen?" wenn ich eine funktion aus der dll calle, dann läuft das über die adresse der funktion und die hat mit der DllMain() absolut nichts am hut.... du kannst sogar voll und ganz auf die DllMain() verzichten....

@topic
lass mal die DLL so wie sie ist... und erstelle ein neues projekt, ums schnell zu machen einfach nur ne consolen anwendung...
un da rufst du einfach nur die funktion LoadLibrary() auf.. und nichts anderes... kein import/export... wenn dann die messagebox nicht kommt, is was schwer faul :)
dann läuft vlt. irgendwas in nem falschen kontex, aber das geht nicht, wenn die messagebox aus Meldung() angezeigt wird.. hm...
wie gesagt auf alles verzichten, nur loadlib...
 
hi Leute!

also es hat endlich geklappt ... danke für euere Antworten ...

ich glaube es liegt an Dev C++ dass es nicht geklappt hat, denn ich bin nur durch Zufall draufgekommen wie es nun funktioniert ... statt einem C++-Projekt habe ich ein C-Projekt erstellt und dann hats funktioniert obwohl ich sonst nichts eingestellt oder verändert habe ... kann das sein, dass es an Dev C++ liegt und da ein Bug drin ist?

Danke nochmals!
 
Zurück