DLL-Funktion lädt nicht



  • Hallo!

    ich habe folgendes Problem:

    Im folgenden Code greife ich auf meine DLL zu, die zwei Funktionen enthält.
    Zum einen eine Funktion MsgBox, die eine Nachricht ausgiebt. Diese wird auch aus der DLL geladen und funktioniert auch reibungslos.

    Die zweite Funktion Add wird jedoch nicht geladen. Ich wäre dankbar, wenn sich jemand diesen Code ansehen könnte, um mir zu sagen, woran es liegt.

    DLL_Launcher.cpp :

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    typedef int (*MsgFunction)(int);
    typedef int (*AddFunction)(int, int);
    
    HINSTANCE hinstDLL;
    
    int main()
    {
        MsgFunction MsgBox(0);
        AddFunction Add;
    
        hinstDLL = LoadLibrary("DLL.dll");
    
        if(hinstDLL != 0){
            MsgBox = (MsgFunction)GetProcAddress(hinstDLL, "MsgBox");
            Add    = (AddFunction)GetProcAddress(hinstDLL, "Add");
            }
        if(hinstDLL == 0)cout << "DLL not found!\n";
        if(Add == 0)cout << "Add Function is NULL.\n\n"; // <- wird mir immer 
                                                         //    ausgegeben
        if(MsgBox == 0)cout << "MsgBox Function is NULL.\n\n";
        int x = MsgBox(5);
        int erg = Add(4, 5);
    
        cout << "Solution: " << erg << "\n\n";
    
        if(x == 5)
        {
            cout << "Message displayed!\n";  // das funktioniert noch
            }
    
        FreeLibrary(hinstDLL);
    
        return 0;
    }
    

    nun die DLL files

    main.cpp:

    #include "main.h"
    
    // a sample exported function
    int DLL_EXPORT MsgBox(int x = 0)
    {
        MessageBox(0, "Loaded DLL!", "DLL Message", MB_OK | MB_ICONINFORMATION);
        return x;
    }
    
    int DLL_EXPORT Add(int x, int y)
    {
        MessageBox(0, "Add Function loaded!", "DLL Message", MB_OK | MB_ICONINFORMATION);
        return (x+y);
    }
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;
    
            case DLL_PROCESS_DETACH:
                // detach from process
                break;
    
            case DLL_THREAD_ATTACH:
                // attach to thread
                break;
    
            case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // succesful
    }
    

    und zu guter letzt main.h:

    #ifndef __MAIN_H__
    #define __MAIN_H__
    
    #include <windows.h>
    
    /*  To use this exported function of dll, include this header
     *  in your project.
     */
    
        #define DLL_EXPORT __declspec(dllexport)
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    int DLL_EXPORT MsgBox(int x);
    int DLL_EXPORT Add(int x, int y);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // __MAIN_H__
    


  • Sieht auf den ersten Blick alles ok aus. Kanns nicht nachvollziehen.



  • Offensichtlich wird die Funktion nicht gefunden.
    Benutze den Dependency Walker um zu prüfen ob und wie die Funktion exportiert wurde.

    http://www.dependencywalker.com/

    Simon



  • danke schonmal für die antworten.

    ich weiß nicht so recht mit dem Dependency Walker umzugehen, aber wenn ich die DLL (DLL.dll) mit Dependency Walker öffne, dann sehe ich in der Export Function List die Funktionen so, wie sie auch normal heißen, also

    Add
    und MsgBox

    im untersten Fenster stehen folgende Warnungen:

    Warning: At least one delay-load dependency module was not found.
    Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.



  • weiß jemand damit was anzufangen?

    wäre euch echt dankbar..



  • Es scheinen ja beide Funktionen exportiert worden zu sein. Also dein Dll-Code ist wohl korrekt. Beim DLL_Launcher: MsgBox scheint ja korrekt geladen zu werden, oder?



  • Vielleicht verschiebt ein Mod diesen Thread mal in das Forum, wo er richtigerweise hingehört: WinAPI.

    Dort gibt es dann bestimmt jemanden, der helfen kann.



  • ja die MsgBox funktion wird korrekt geladen, bloß die andere nicht -.-



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Was sagt denn GetLastError, nachdem GetProcAddress NULL zurückgegeben hat?



  • Also ich war mal so frei und hab den ganzen Code compiliert und bei mir läuft er einwandfrei. Muss also an etwas anderem liegen, wohl eher Compiler/Linker Einstellung 😕

    Lg Tobi



  • GetLastError gibts mir 127 zuück.

    in der msdn steht:

    ERROR_PROC_NOT_FOUND
    127 (0x7F)

    The specified procedure could not be found.

    😕 woran liegt das?



  • (bist du dir sicher das nicht nur die erste funktion bei dir geladen hat? Weil die ja funktioniert 😕 )

    okay.. hm ich benutze Codeblocks unter winxp
    muss mal die einstellungen durchforsten



  • Okay, entschuldigung für diesen dreifachpost ( omfg dreifach -.-'' )

    Ich habe ein Internet-beispiel gefunden, welches fast exakt die selbe Funktion aus einer dll lädt.

    Diese funktioniert auch perfekt, sodass ich nun diese erstmal genauestens unter die Lupe nehmen werde.

    Danke trotzdem für jegliche Bemühungen.

    MfG Sys_Shutdown



  • System_Shutdown schrieb:

    GetLastError gibts mir 127 zuück.

    in der msdn steht:

    ERROR_PROC_NOT_FOUND
    127 (0x7F)

    The specified procedure could not be found.

    😕 woran liegt das?

    Daran, dass diese Funktion nicht in der DLL zu finden ist. Wenn LoadLibrary funktioniert und die DLL gefunden und geladen wird, scheint das Problem an einer anderen Stelle zu liegen.

    Hm, mit "extern C" sollte das Name Mangling ja auch funktionieren.

    Was sagt denn folgendes Progamm http://www.nirsoft.net/utils/dll_export_viewer.html zu den Exporten aus der DLL? Analysiere das mal.



  • Hallo System_Shutdown,

    hast du vllt. die Add Funktion erst später hinzugefügt und bei dir liegt noch eine alte DLL rum, auf die dann per LoadLibrary zugegriffen wird (d.h. der Pfad ist falsch).



  • Joa compilier die DLL noch mal neu und steck sie erneut ins Verzeichnis des loaders.

    Lg Tobi



  • hm ja das kann bei codeblocks gut möglich sein, weiß garnicht ob ich die neueste version hab..

    auf jeden fall compiliert codeblocks manchmal fehlerhaft

    ..wie gesagt habe ich jetz ein anderes beispiel näher unter die lupe genommen und bis jetzt haben alle funktionen die ich geschrieben hab funktioniert ^^

    ich brauch ab hier keine hilfe mehr. danke an euch alle ^^


Anmelden zum Antworten