DLLs Laden?


  • Mod

    Kann nicht sein. Deine Funktion wird nicht als C Funktion gesucht, sondern mit C++ Signatur.

    Zudem zeigt Dein Header eine MyFunc und gesucht wird eine Funktion test laut Fehlermeldung!



  • Zudem zeigt Dein Header eine MyFunc und gesucht wird eine Funktion test laut Fehlermeldung!

    Oh entschuldigung, war doof von mir... hätte zweimal die gleichen Beispiele nehmen sollen! Hab die beiden Funktionen nur schell erfunden um die beispiele übersichtlich zu halten in wirklichkeit gibt es keine von beiden.

    Kann nicht sein. Deine Funktion wird nicht als C Funktion gesucht, sondern mit C++ Signatur.

    Das versteh ich jetzt nicht ganz. Die DLL ist in C geschrieben und ich möchte sie in C++ aufrufen, dann müsste mein Beispiel doch stimmen.

    Ich habe auch keine Möglichkeit die DLL zu ändern, oder mache ich etwas falsch?

    Danke und Lg
    Kerberos


  • Mod

    Nein! Du verstehst das falsch. Eine C++ Funktion kann auch aus C aufgerufen werden. Dafür ist das extern "C" da.

    Die Funktionen müssen immer gliech deklartiert und definiert werden.



  • Nein! Du verstehst das falsch.

    Falsch! Eigentlich versteh ich es jetzt garnicht mehr 😉

    Eine C++ Funktion kann auch aus C aufgerufen werden. Dafür ist das extern "C" da.

    Aber warum steht dann folgendes im Header der DLL, die ich importieren soll:

    #if defined(__cplusplus) || defined(__cplusplus__)
    extern "C" {
    #endif
    
    ...
    
    #if defined(__cplusplus) || defined(__cplusplus__)
    }
    #endif
    

    Außerdem hab ich folgende Beschreibung auf www.cpp-tutor.de gefunden:

    Wollen Sie von einem C++ Programm aus auf Funktionen zugreifen, die mit einem C-Compiler (nicht C++ Compiler!) übersetzt worden sind, so müssen Sie diese Funktionen als extern "C" Funktionen kennzeichnen.

    Die Funktionen müssen immer gliech deklartiert und definiert werden.

    Meinst du damit, dass ich in C++ vor den Funktionsaufruf irgendwie sowas wie DLLIMPORT schreiben muss?

    Danke und Lg
    Kerberos



  • Sag mal kerberos, arbeitest du für die Datev oder ein ähnliches Unternehmen? 😃


  • Mod

    DLL und nutzende EXE müssen halt garantiert identische Deklaration und Definitionverwenden.

    In C++ wird ein anderes Beanumgssystem verwendet (Name-Mangeling), dass Rückgabewert und Argumente in den internen Namen der Objektdatei einbindet.
    Bei extern "C" wird nur ein Name wie er ist verwendet, weil C dieses Name-Mangeling nicht benutzt.

    Wenn Du also GetProcName verwenden willst sollte extern "C" genutzt werden. Intern, wenn nur C++ verwendet wird wäre dies egal. Solte C/C++ gemischt genuttz werden, dann musst Du extern "C" in den C++ Modulen benutzen.



  • Sag mal kerberos, arbeitest du für die Datev oder ein ähnliches Unternehmen? 😃

    Häh? Wieso?

    DLL und nutzende EXE müssen halt garantiert identische Deklaration und Definitionverwenden.

    Aber der Entwickler dieser DLL hat ja extra das extern "C" hinzugefügt damit die .h-Datei auch von einem C++ Entwickler inkludiert werden kann.

    Wenn ich diese .h-Datei benutze, habe ich ja exakt die gleiche Prototypanweisung, also kann es doch nicht an der Deklaration liegen, oder muss man direkt beim Aufruf auch noch etwas angeben, was ich mir aber nicht vorstellen kann?

    Danke und Lg
    Kerberos


  • Mod

    kerberos schrieb:

    DLL und nutzende EXE müssen halt garantiert identische Deklaration und Definitionverwenden.

    Aber der Entwickler dieser DLL hat ja extra das extern "C" hinzugefügt damit die .h-Datei auch von einem C++ Entwickler inkludiert werden kann.

    Wenn ich diese .h-Datei benutze, habe ich ja exakt die gleiche Prototypanweisung, also kann es doch nicht an der Deklaration liegen, oder muss man direkt beim Aufruf auch noch etwas angeben, was ich mir aber nicht vorstellen kann?

    Quatsch. Ein C++ Programm braucht extern "C" gar nicht. Nur wenn die Funktionen auch aus C verwendet werden, dann benötigt man extern "C", das schließt ein das die DLLs implizit geladen werden und die Funktionen per GetProcAddress ermittelt wird.

    Identisch? Mit extern "C"?
    Dann bitte zeige das genau noch mal...
    Was für Fehlermeldungen kommen wo?
    Dann schau dochmal mit mit Depends in die DLL und schau was wirklich exportiert wird.



  • Hi,

    es funktioniert jetzt, lag an der DLL selbst. Aber noch einmal zu dem extern "C", also entweder reden wir aneinander vorbei oder ich versteh es einfach nicht.

    Wenn ein C-Entwickler eine DLL entwickelt, dann wird den Benutzern der DLL (bei früher Bindung) eine ".h" eine ".lib" und eine ".dll" zur Verfügung gestellt.
    Dieser C-Entwickler kann doch folgende Zeilen einbauen, damit diese ".h"-Datei sowohl von C als auch von C++ Entwicklern verwendet werden kann.

    #if defined(__cplusplus) || defined(__cplusplus__) 
    extern "C" { 
    #endif 
    
    ...
    
    #if defined(__cplusplus) || defined(__cplusplus__) 
    } 
    #endif
    

    Dadurch kann ich die ".h"-Datei, welche in C geschrieben ist in mein C++ Projekt inkludieren und kann alle Makros, Strukturen und Funktionen verwenden ohne diese in meinem Quelltext zu definieren.
    So hab ich das verstanden.

    Lg und Danke
    Kerberos


  • Mod

    Jo! Ich habe mich evtl. etwas ungeschickt ausgedrückt. Gemeint habe ich das selbe.


Anmelden zum Antworten