DllMain wird nicht aufgerufen! :(



  • 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? 😛

    hier ist der Code vom Hauptprogramm:

    #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:

    #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!



  • bau mal ein '__declspec(dllexport)' vor die 'DllMain'. vielleicht geht's dann...



  • nein, auch nicht ... weiß nicht warum der Autor sowas schreibt wenns gar nicht stimmt, er schreibt SEiten drüber, wann wie aufgerufen wird, mit welchen Parametern ... das nervt mich total



  • tja, was kann's denn noch sein 😕
    schau dir die dll mit diesem programm an: http://www.dependencywalker.com/
    sie sollte eine funktion exportieren, die so aussieht: _DllMain@12
    wenn's immer noch nicht geht: man kann in den linkereinstellungen die startfunktion angeben. dort mal 'DllMain' eintragen.



  • danke für deine Antwort, könntest du mir noch sagen, wie man das mit den Linkereinstellungen macht? ich hab nämlich gesucht, aber nichts gefunden, man kann lediglich Parameter fürs Linken angeben aber ka was da hin muss



  • meistens etwa so:
    /entry: "DllMain"
    ...müsstest du mal in der doku deines linkers schauen 😉



  • ok Leute, danke für eure Antworten, ich habs probiert
    /entry: "DllMain" <- hat mein Linker zwar komentarlos geschluckt und die DLL neuerstellt, aber es hat sich nichts geändert ... ich gebs auf



  • Was du in DllMain tun darfst, ist ziemlich eingeschränkt.

    MSDN Library schrieb:

    Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose



  • Hat das irgendwas mit datenbanken zu tun?? 😕



  • nix 😉

    Hast du denn Tipp von net schon befolgt und mit dem Dependency Walker geprüft, ob deine DLL auch die DllMain wirklich exportiert ?



  • Ich hat das gleiche Problem. Es liegt an irgendwelchen Einstellung Preprozessorsymbolen ... das DllMain nicht exportiert wird. Ich habe einfach __declspec(dllexport) vor die Funktion geschrieben. Dann wurde sie aufgerufen.

    Vielleicht hilfst.

    Gruß Thomas



  • #define AS __declspec(dllexport)
    #define SP if (Output == NULL) return (1); *Output = calloc(3,sizeof(char));	if (*Output == NULL) return (2);
    
    BOOL APIENTRY DllMain ( HINSTANCE hInst, DWORD reason, LPVOID reserved )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            OutputDebugString ("DLL_PROCESS_ATTACH"); break;
    
          case DLL_PROCESS_DETACH:
            OutputDebugString ("DLL_PROCESS_DETACH"); break;
    
          case DLL_THREAD_ATTACH:
            OutputDebugString ("DLL_THREAD_ATTACH"); break;
    
          case DLL_THREAD_DETACH:
            OutputDebugString ("DLL_THREAD_DETACH"); break;
        }
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    
    int AS asInfo (char **Output, char **Input, int param_cnt)
    {SP;
      FILE *f = fopen("test.txt", "a+");
    
      OutputDebugString ("Diese DLL ist von coolzero");
      MessageBox(0,TEXT("Diese DLL ist von coolzero :-)"),TEXT("DLL Funktionen"),0);
      sprintf(*Output, "Error von %s\n\n", *Input);
    
      fprintf(f, "Input[0] <%s>\n", Input[0]);
      fprintf(f, "Input[1] <%s>\n", Input[1]);
      fprintf(f, "Input[2] <%s>\n", Input[2]);
    
      free(Output); close(f);
      return (1);
    }
    

    #define SP if (Output == NULL) return (1); *Output = calloc(3,sizeof(char)); if (*Output == NULL) return (2);
    // Hier wird Speicher angefordert für das was du übergeben willst!

    Das Prog. Dependencies, zeigt: " asInfo " als Funktionsname!

    "OutputDebugString" kann man mit dem Programm 'DebugView von Sysinternals' auslesen!

    Im DevC++, unter den Proj.-Einstellungen sind folgende Werte drinn:
    Compiler: "-DBUILDING_DLL=1"
    C++Compiler: "-DBUILDING_DLL=1"
    Linker: "--no-export-all-symbols --add-stdcall-alias -lgmon"

    Ich hoffe, ich habe jetzt nichts vergessen! 😃 😕


Anmelden zum Antworten