Frage

Ich bin stecken auf Sie ein Update auf eine ältere Visual C++ 6 app.In der C++ - DLL-Quelle, die ich haben

extern "C" _declspec(dllexport) char* MyNewVariable = 0;

die Ergebnisse in MyNewVariable angezeigt (schön undekoriert) in der Tabelle 'export' (dargestellt durch dumpbin /exports blah.dll).Ich kann jedoch nicht herausfinden, wie um die variable zu deklarieren, so dass ich es in eine C-Quelldatei.Ich habe versucht, verschiedene Dinge, einschließlich

_declspec(dllimport) char* MyNewVariable;

aber das macht mir einfach einen linker-Fehler:

nicht aufgelöstes externes symbol "__declspec(dllimport) char * MyNewVariable" (__imp_?MyNewVariable@@3PADA)

extern "C" _declspec(dllimport) char* MyNewVariable;

wie vorgeschlagen von Tony (und als ich versuchte, den vor -) Ergebnisse in einer anderen erwarteten Dekoration, aber immer noch nicht beseitigt:

nicht aufgelöste externes symbol __imp__MyNewVariable

Wie Schreibe ich die Deklaration so, dass die C++ - DLL-variable erreichbar von der C-app?


Die Antwort

Die durch botismarius und anderen (vielen Dank an alle), die ich brauchte, um die Verknüpfung mit der DLL .lib.Um zu verhindern, dass die Namen entstellt, die ich brauchte, es zu erklären (in der C-Quelle), die mit keine Dekorateure, was bedeutet, dass ich brauchte, um das .lib-Datei.

War es hilfreich?

Lösung

Sie müssen verlinken gegen die lib erzeugt wird, nachdem die DLL kompilieren. In den Linker-Optionen des Projekts, müssen Sie die .lib Datei hinzufügen. Und ja, sollten Sie auch die Variable deklarieren:

extern "C" { declspec(dllimport) char MyNewVariable; }

Andere Tipps

extern "C" ist, wie Sie Dekoration entfernen - es sollte verwenden arbeiten:

extern "C" declspec (Dllimport) char MyNewVariable;

oder wenn Sie einen Header wollen, die von C ++ verwendet werden kann, oder C (mit / TC-Schalter)

#ifdef __cplusplus
extern "C" {
#endif
declspec(dllimport) char MyNewVariable;
#ifdef __cplusplus
}
#endif

Und natürlich verbindet mit der Importbibliothek der DLL erzeugt, um den Export zu tun.

Ich bin mir nicht sicher, wer botismarius downmodded, weil er richtig ist. Der Grund dafür ist die LIB die Importbibliothek erzeugt ist, dass es einfach zu einfach erklären die externe Variable / Funktion mit __declspec(dllimport) macht und es einfach zu verwenden. Die Importbibliothek automatisiert einfach die notwendigen LoadLibrary() und GetProcAddress() Anrufe. Ohne sie, müssen Sie diese manuell aufrufen.

Sie sind beide richtig. Die Tatsache, dass die Fehlermeldung __imp_?MyNewVariable@@3PADA beschreibt bedeutet, dass es für den ergänzten Namen sucht, so dass die extern „C“ notwendig ist. Doch mit der Importbibliothek verknüpft ist auch notwendig oder Sie einfach einen anderen Link-Fehler.

@Graeme: Sie haben Recht auf das auch. Ich denke, die „C“ Compiler, der die OP unter Verwendung ist C99-Standard nicht erzwingen, aber kompilieren wie C ++, also die Namen Mangeln. Ein wahrer C-Compiler würde die „C“ Teil des extern "C" Schlüsselwort nicht verstehen.

dll Quellcode sollten Sie diese Implementierung haben, so dass die LIB-Datei Exporte das Symbol:

extern "C" _declspec(dllexport) char* MyNewVariable = 0;

Der c-Client sollte ein Header mit dieser Erklärung, so dass der Client-Code wird Import das Symbol:

extern "C" _declspec(dllimport) char* MyNewVariable;

Dieser Header wird einen Compiler-Fehler verursachen, wenn # include-ed in der DLL-Quellcode, so ist es in der Regel in einem Export Header setzen, die für die exportierten Funktionen nur verwendet wird, und nur von Kunden.

Wenn Sie möchten, können Sie auch einen „universellen“ Header erstellen, die überall aufgenommen werden können, die wie folgt aussehen:

#ifdef __cplusplus
extern "C" {
#endif
#ifdef dll_source_file
#define EXPORTED declspec(dllexport) 
#else
#define EXPORTED declspec(dllimport) 
#endif dll_source_file
#ifdef __cplusplus
}
#endif

EXPORTED char* MyNewVariable;

Dann wird die DLL-Quellcode sieht wie folgt aus:

#define dll_source_code 
#include "universal_header.h"

EXPORTED char* MyNewVariable = 0;

Und der Kunde sieht wie folgt aus:

#include "universal_header.h"
...
MyNewVariable = "Hello, world";

Wenn Sie dies viel zu tun, das Monster #ifdef an der Spitze in export_magic.h gehen und universal_header.h wird:

#include "export_magic.h"

EXPORTED char *MyNewVariable;

Ich habe noch nie verwendet __declspec (dllimport), als ich die Programmierung unter Windows. Sie sollten einfach in der Lage sein, zu erklären,

extern "C" char* MyNewVariable;

und Link zur .libb erstellt, wenn DLL kompiliert wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top