DLL Problem



  • Hallo,

    Kurz zu meiner Ausgangssituation. Ich probiere mich gerade im Bereich dll Programmierung und hab wenig Ahnung davon.

    Mein Ziel ist es, eine DLL Datei zu programmieren, welche eine Initialisierungsfunktion hat, die lediglich eine MessageBox anzeigen soll.

    Also kurz: Man inkludiert die dll in einem Programm und eine MessageBox wird ausgeführt.

    Arbeite unter DEV C++ und habe als Projekt dll Datei ausgewählt.

    /* Replace "dll.h" with the name of your header */
    #include "dll.h"
    #include <windows.h>
    
    DllClass::DllClass()
    {
    
    }
    
    DllClass::~DllClass ()
    {
    
    }
    
    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
        MessageBox(NULL, "!!! test !!!", "test", 0); 
    
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    

    Stimmt das soweit? Der Kompilierungsvorgang funktioniert und ich bekomme eine test.dll

    Wie binde ich die jetzt aber in mein Projekt ein?

    // DLL Datei laden
    HINSTANCE hinstLib = LoadLibrary("dll.dll");
    

    Leider zeigt er dann aber keine MessageBox an 😞

    Hoffe jemand kann mir weiter helfen.
    Danke schonmals!



  • Stimmt das soweit? Der Kompilierungsvorgang funktioniert und ich bekomme eine test.dll

    Deine DLL heißt also test.dll?
    Dann ist der Aufruf hier falsch:

    HINSTANCE hinstLib = LoadLibrary("dll.dll");
    

    Müsste auch test.dll sein, statt dll.dll. Abgesehen davon sucht LoadLibrary diverse Pfade ab, wenn du nur den DLL-Namen, aber keinen Pfad angibst. Sieh mal hier:
    http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx

    Wie sieht hinstLib aus? Ist es NULL? Wenn ja, bemüh mal GetLastError um herauszufinden, warum die DLL nicht geladen wurde.



  • Mein Fehler, die Dll heißt natürlich dll.dll.

    Ich probiere jetzt mal den kompletten Pfad an zu geben.



  • Das Programm, welches die DLL Inkludiert (ist ein Konsolenprogramm)

    #include <cstdlib>
    #include <iostream>
    #include <stdio.h> 
    #include <windows.h> 
    
    using namespace std;
    
    typedef double (*AddNumbers)(double, double);
    
    int main(int argc, char *argv[])
    {
        cout << "Loading DLL..." <<endl;
    
    // DLL Datei laden
    HINSTANCE hinstLib = LoadLibrary("C:\\Dev-Cpp\\projects\\dllcaller\\dll.dll");
    
    if (hinstLib == NULL)
       cout << "hinstLib ist NULL" << endl;
    else
       cout << "hinstlib != NULL" << endl;
    
         system("PAUSE");
         return EXIT_SUCCESS;
    }
    

    Ergebnis ist:

    Loading DLL...
    hinstlib != NULL
    Drücken Sie eine beliebige Taste . . .

    Scheint also, dass die DLL geladen wird. Wird jedoch kein MessageBox angezeigt?

    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
        MessageBox(NULL, "!!! test !!!", "test", 0); 
    ...
    ...
    ...
    

    Sollte eigentlich schon in Ordnung sein, oder?



  • In DllMain darf man nur sehr beschränkt Code ausführen.
    Details findest Du auf MSDN. Es ist fraglich ob der MessageBox Aufruf da erlaubt ist.

    Simon



  • In der MSDN steht:

    Calling other functions may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions in their DLLs call LoadLibrary to load other system components. Conversely, calling those functions during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.

    Ich denke MessageBox fällt da auch darunter, explizit steht es da aber nicht...



  • Vielen Dank!

    Gibt es sonst ne Möglichkeit, wie ich eine MessageBox ausführen kann, sobald die DLL geladen wird?
    Also ohne jetzt explizit eine Funktion aufrufen zu müssen?

    Initialization Function oder sowas? 🙂

    Grüße





  • WinMain != DllMain



  • Überlesen...

    Okay ich formuliers mal so:
    Ich brauche eine DLL, welche eine MessageBox angezeigt, sobald diese von einem Programm geladen wird.

    Ist das möglich?
    Wenn ja wie?

    Viele Dank 🙂



  • Es gibt da noch CWinApp::InitInstance.
    Von welcher Klasse erbt deine DllClass-Klasse?



  • extern "C" int APIENTRY
    DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    

Anmelden zum Antworten