DLLs Laden?
-
Hi,
ich versuche heute schon den ganzen Tag eine DLL zu importieren. Leider bekomme ich folgende Fehlermeldung:
unresolved external symbol referenced in function "void __cdecl test(void)" (?test@@YAXXZ)"
Folgende Einstellungen habe ich vorgenommen:
Tools -> Options... -> Projects and Solutions -> VC++ Directorys:
Dort habe ich bei "Include files" das Verzeichnis angegeben, in dem sich die ".h" Dateien befinden
und bei "Library files" das Verzeichnis, in dem sich die ".lib" und die ".dll" befindet.Des Weiteren hab ich auch schon probiert alle benötigten Dateien ins Sourcen-Verzeichnis der Anwendung zu legen, hat auch nix gebracht. Die DLL hab ich auch schon in den System32-Ordner kopiert.
Ich hab mir dann die DLL mal mit dem Dependency Walker angeschaut und der bringt folgende Meldung:
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
Was mach ich denn jetzt schon wieder falsch?
Lg und Danke
Kerberos
-
Sieht fast so aus als würdest du den Header in C++ einbinden; dann fehlt ein extern "C" vor den Funktionen der DLL,
bzw. sowas#ifdef __cplusplus extern "C" { #endif void Dll_Funktion_1(int a); void Dll_Funktion_2(char* a, double b); ... #ifdef __cplusplus } #endif
-
Hi,
Erstmal Danke für deine Antwort!
Also im Header ist folgendes definiert:
#if defined(__cplusplus) || defined(__cplusplus__) extern "C" { #endif #define ... void DLLEXPORT DLLSTDCALL MyFunc(); #if defined(__cplusplus) || defined(__cplusplus__) } #endifMüsste doch eigenltich passen?
Lg
Kerberos
-
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
-
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__) } #endifAuß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?

-
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
-
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__) } #endifDadurch 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
-
Jo! Ich habe mich evtl. etwas ungeschickt ausgedrückt. Gemeint habe ich das selbe.