DLL Einbinden



  • Hallo,

    ich habe ein Beispiel gefunden, wie man eine DLL in seinen ausführbaren Quellcode bekommt.
    (http://www.coding-board.de/board/attachment.php?s=eaddf78edc3fc6e8d08c0010f35500f6&attachmentid=1&d=1022568216))
    Allerdings gibt es dort eine *.lib. Wie bekomme ich die da heraus?
    (Natürlich soll das Programm trotzdem noch laufen... - wer gerade an löschen gedacht hat)

    Mein Rechner ist ein Vista - System, und ich arbeite mit Visual C++ 6.0 (gezwungendermaßen)

    MfG
    cluehr



  • Die lib wird über den linker ganz normal gebunden.
    Edit:
    Visual Studio erstellt die automatisch wenn man über ein .def-file die Funktionen exportiert oder per __declspec(dllexport), das gilt aber nur, wenn man selbst eine DLL schreibt. Ist mir nicht ganz klar, was du grade willst :). Zur DLL linken oder eine basteln.
    rya.



  • Hallo rya,

    Visual Studio erstellt die automatisch wenn man über ein .def-file die Funktionen exportiert oder per __declspec(dllexport), das gilt aber nur, wenn man selbst eine DLL schreibt.

    habe es gerade mal getestet; das läuft soweit, erst einmal thx dafür

    Wird die *.lib im Projektordner eigendlich automatisch erkannt? (habe keinen Eintrag "dll.lib" in irgendwelchen Projekteinstellungen gefunden)

    Soweit so gut...
    Aber kann man nicht auch Funktionen einer DLL ohne einer zusätzlichen *.lib benutzen?
    Das war mit

    Allerdings gibt es dort eine *.lib. Wie bekomme ich die da heraus?

    gemeint (sry, war ein wenig unpräziese)

    MfG
    cluehre



  • cluehre schrieb:

    Soweit so gut...
    Aber kann man nicht auch Funktionen einer DLL ohne einer zusätzlichen *.lib benutzen?

    Ja kann man. Dann muß man die dll dynamische laden. Siehe dazu
    LoadLibrary, GetProcAddress etc.



  • Hallo Braunstein,

    Siehe dazu LoadLibrary, GetProcAddress etc.

    habe dazu folgenden Code geschrieben

    Erstellen der DLL

    #include <windows.h>
    
    #include "stdafx.h"
    
    extern"C" _declspec(dllexport) int add (int a, int b);
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
    
    int add (int a, int b)
    {
    	return a + b;
    }
    

    Nutzen der DLL (speziell die add - Fnktion)

    #include "stdafx.h"
    #include <stdio.h>
    #include <windows.h>
    
    typedef int (CALLBACK* DLLFUNC)(int, int);
    
    int __declspec (dllimport) add (int a, int b);
    
    DLLFUNC DllFunc1;
    
    void main(int argc, char* argv[])
    {
    	int a=1;
    	int b=2;
    
    	HMODULE hMod=LoadLibrary("dll");
    	if (hMod==NULL){
    		printf("Keine DLL gefunden");
    	}
    
    	DllFunc1 = (DLLFUNC)GetProcAddress(hMod, "add");
    
    	if (!DllFunc1){
    		printf("Keine \"add\" - Funktion gefunden");
    
    	}else{ 
    	printf("Aufruf");
    		a=DllFunc1(a,b);
    	}
    	FreeLibrary (hMod);
    
    }
    

    Das Problem ist das die add - Funktion nicht gefunden wird.(das printf in Zeile26 wird ausgeführt) Sieht evtl. jemand den Grund?

    MfG
    cluehre



  • Richtig wäre:

    extern "C"
    int add (int a, int b)
    {
    return a + b;
    }

    rya.



  • moin zusammen,

    thx scorer habes es zum laufen bekommen.

    Nun habe ich die Problematik ne ganze Klasse in ne DLL bekommen zu müssen.

    Stumpf

    extern"C" _declspec(dllexport)
    

    geht leider nicht 😞

    Muss man da was besonders beachten?
    Ich denke dieses

    BOOL APIENTRY DllMain( HANDLE hModule,
         DWORD  ul_reason_for_call,LPVOID lpReserved)
    {return TRUE;}
    

    muss durch irgendetwas ersetzt werden.

    Nochwas:
    - Die Klasse muss dynamisch aufrufbar sein.
    - Kompilerkompatibilitäten sind kein Problem.
    - Benutze Visual C++ 6.0

    Thx für alles was euch dazu einfällt
    MfG cluehre





  • ohmg... nette animation die du da rausgekramt hast...die kannte ich noch nicht^^

    wenn noch jemand was hat, was weiterhelfen könnte bin ich sehr dankbar

    MfG cluehre



  • Naja, das beste ist, du legst im allgemeinen Header von deiner DLL erstmal ein Makro an ( ich hoffe du hast so nen Uberheader, wenn nicht mach dir einen :p )

    #if defined(MYPROJECT_EXPORTS) && defined(WIN32) // <- das kannst du nennen wie du es willst, muss aber bei der DLL in den Präprozessor
    #define MY_EXPORT __declspec(dllexport)
    #elif defined(WIN32)
    #define MY_EXPORT _declspec(dllimport)
    #endif /* EXPORT */
    [cpp]
    Das macht man, damit automatisch entschieden wird, imported oder exported wird. 
    Dann sollte das so gehen: 
    [cpp]
    extern "C" MY_EXPORT int foobar(int a, int b);
    

    Alternativ kannst du ohne _declspec aus einer .def-Datei exportieren, die du beim linken angibst:

    EXPORT
        add @1
    

    EXPORT muss oben hin, das heisst, dass exportiert wird.
    add @1 heisst, dass add als erste funktion exportiert wird. In dem Fall reicht die Deklaration von add mit:

    int add(int a, int b);
    

    Und ja, da kann man dann auch Klassen exportieren. Man darf es aber auf keinen Fall in C-Code dann verwenden.
    HTH
    rya.



  • Hallo

    thx @scorcher24 hast mir sehr weitergeholfen.
    warscheinlich habe ich das soweit hinbekommen; der Compiler ist zumindest einverstanden.

    Das Problem ist das ich die Klasse nicht mehr aus der DLL bekomme; die Klasse also in meinem Hauptprogramm nicht verwenden kann.
    Mit GetProgAddress get es ja nicht. Gibt es eine äquivalente Funktion/Strategie für Klassen?
    Oder geht sowas überhapt nicht, bzw. ist schlecht umsetzbar.

    Hat jemand nen Strategieänderung? Bin für alles offen.

    *sry wegen der ganzen dummen fragen, bin ein newbie was die Thematik angeht*

    MfG



  • Wie ich bereits schrieb: Es ist egal ob du Klassen oder Werte zurückgibst. Wenn du eine Funktion aus einer DLL manuell lädst, ist nur der Name wichtig. Du musst halt wissen, was diese Funktion zurückgibt.
    http://www.google.de/search?hl=de&ei=tgCVSarxBM-n-gbJm7yOCQ&sa=X&oi=spell&resnum=1&ct=result&cd=1&q=how+to+export+from+a+dll+on+windows&spell=1
    rya.


Anmelden zum Antworten