Selbstgeschriebene DLL einbinden funzt nicht :(



  • Hallo,
    Ich hab in Google folgendes Tutorial gefunden für das schreiben und einbinden von DLLs:
    Tutorial
    Dann hab ich mit meinem DEV-C++ ein neues Projekt gemacht,ne DLL.
    Da hab ich dann folgendes reingeschrieben:

    #include <windows.h>
    
    /////ICH HAB lib.h GLEICH SO IN DEN SOURCE GESCHRIEBEN ;-)
    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    
    EXPORT void CALLBACK Funktion(void); 
    /////ende von lib.h 
    
    int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    {
    return TRUE ;
    }
    
    EXPORT void CALLBACK Funktion(void)
    {
    MessageBox( NULL, "Hallo Welt !", "Info aus der DLL", MB_ICONINFORMATION );
    }
    

    die hat er auch Compiliert und ich habe lib.dll bekommen 🙂

    Danach hab ich ein neues Projekt angefangen,eine WIN32 Anwendung und folgendes "reingeschrieben" :

    #include <windows.h>
    
    /////ICH HAB lib.h GLEICH SO IN DEN SOURCE GESCHRIEBEN ;-)
    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    
    EXPORT void CALLBACK Funktion(void); 
    /////ende von lib.h
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    Funktion();
    return 0;
    }
    

    DLL liegt im gleichen Verzeichniss und er gibt mir trotzdem folgenden Fehler aus beim Versuch das Windwos Programm zu Compilieren:

    [Linker error] undefined reference to `Funktion@0'
    ld returned 1 exit status
    [...]\Makefile.win [Build Error] [projekt.exe] Error 1

    Weiß wer an was das liegen kann?
    Ich mach ja (hoffentlich) alles wie im Tutorial

    Schon mal Danke,
    Mr.DLL 😃



  • Dein Tutorial ist entweder total daneben oder du hast es nicht richtig verstanden.
    sieh dir mal LoadLibrary() in der MSDN an. Deine DLL mag korrekt sein, aber die Laufzeiteinbindung ist totaler schwachsinn.

    chris90



  • Das Tut ist total daneben 😉
    Ich hab jetzt folgenden Code von hier abgeändert:

    #include <windows.h>
    
    typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    HINSTANCE hDLL;               // Handle to DLL
    LPFNDLLFUNC1 Funktion;    // Function pointer
    
    hDLL = LoadLibrary("lib.dll");
    if (hDLL != NULL)
    {
     Funktion = (LPFNDLLFUNC1)GetProcAddress(hDLL,"Funktion"); 
       if (!Funktion)
       {
          FreeLibrary(hDLL);
          return 0;
       }
       else
       {
          Funktion();
       }
    }
    
    return 0;
    }
    

    aber er sagt immer

    In function `int WinMain(HINSTANCE__, HINSTANCE__, CHAR*, int)':
    too few arguments to function

    und makiert

    Funktion();
    

    aber Funktion() is doch void 😮
    Wenn ich dann

    Funktion(void);
    

    schreibe kommt er immer mit

    In function `int WinMain(HINSTANCE__, HINSTANCE__, CHAR*, int)':
    expected primary-expression before "void"

    Weiß jemand was ich falsch mache?

    Danke schon mal 🙂



  • Möglichkeiten gibt es derer viele.

    Wenn man dem armen Drops schon LoadLibrary vor die Füsse wirft, dann doch auch gleich GetProcadress. Kann ja nicht so schwer sein.

    Ausserdem kann man natürlich auch die die DLL linken. Soll heissen, du bindest in Deinem Projekt die Datei lib.lib mit ein. Wie das funktioniert, hängt ganz von der verwendeten GDI ab (Die Hilfe kann Dir sicher helfen).

    Gruß André



  • Du solltest die Definition Deines Funktionspointers prüfen.
    Der muss wohl so lauten:
    typedef void (CALLBACK* LPFNDLLFUNC1)(void);

    Gruß André



  • Wie bekomm ich denn die lib.lib?

    Danke



  • wird afaik beim Erstellen der Dll miterstellt



  • Die findest Du im Debug oder Release Verzeichnis Deines Projektes.
    Im Zweifelsfall findet Du sie mit der Suchenfunktion des Win-Explorers. 😉

    Gruß André



  • ; dlltool --base-file C:\DOKUME1\Root\LOKALE1\Temp/cca02660.base --output-exp lib.exp --dllname lib.dll --output-def liblib.def --no-export-all-symbols --add-stdcall-alias --exclude-symbol=DllMainCRTStartup@12 --def C:\DOKUME1\Root\LOKALE1\Temp/cca02660.def --output-lib liblib.a
    EXPORTS
    Funktion@0 @ 1
    Funktion = Funktion@0 @ 2

    DES?
    Des heißt aber liblib.def 😮

    Mr.DLL



  • So sorry wegen Doppelpost aber wenns liblib.def ist wie kann ich des mit einbinden?
    Schon mal Danke vorallem an av_privat 🙂

    Mr.DLL



  • hmm, die DEF-Datei ist aber nicht das richtige.
    Eher das Ende: --output-lib liblib.a
    Das scheint erfolgsversprechender zu sein. Allerdings muss das schon .lib am Ende haben. Ich habe leider keine Ahnung, wie das in der Entwicklungsumgebung funktioniert (zumindest scheint es kein Visual Studio zu sein). Da solltest Du mal das Handbuch oder die Hilfe konsultieren.

    Andere Frage: Hat denn nun das GetProcadress funktioniert? Dann musst Du nicht mehr die Lib linken (eins von beidem reicht).

    Gruß André



  • aaalso:
    hier ein bisschen beispiel-code (stammt nicht von mir wie man sieht, läuft aber bei mir):

    hinstLib = LoadLibrary(TEXT("Projekt1.dll")); 
    
                    // If the handle is valid, try to get the function address.
    
                    if (hinstLib != NULL) 
                    { 
                        ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("myputs")); 
    
                        // If the function address is valid, call the function.
    
                        if (NULL != ProcAdd) 
                        {
                            fRunTimeLinkSuccess = TRUE;
                            (ProcAdd) (); 
                        }
    
                        // Free the DLL module.
    
                    } 
    
                    // If unable to call the DLL function, use an alternative.
    
                    if (! fRunTimeLinkSuccess) 
                    MessageBox(hwnd, "ALtenatr method", "sss", 0);            
                        fFreeResult = FreeLibrary(hinstLib);
    

    EDIT: Hier kommt noch der "header":

    typedef int (*MYPROC)(); 
                    HINSTANCE hinstLib; 
                    MYPROC ProcAdd; 
                    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
    

    greeetz
    chris90



  • Das Beispiel funktioniert mit Sicherheit für dieses Prblem.
    Allerdings möchte ich auf die Stolperfalle hinweisen. Auch hier stimmt die Definition des Funktionspointers nicht ganz. So wie ich den Code von Mr.DLL lese, hat seine CallBack den Rückkehrwert void. deshalb sollte die Definition so aussehen:

    typedef void (*MYPROC)(void);
    

    Gruß André



  • So,
    das mit der DLL funzt jetzt 🙂
    Danke nochmal

    Mr. DLL


Anmelden zum Antworten