2011-01-11 6 views
0

Ich verwende Microsoft Visual C++ 2010 Express, unter Windows XP.Externe Punkte zu 0x00000000

Ich habe eine Anwendung, die eine DLL erzeugt, eine Header-Datei in dieser Anwendung deklariert auch einen Zeiger auf einen BUFFER als extern. Um diese DLL mit dem System zu registrieren, ziehe ich es auf das Regsvr32.exe-Symbol im Ordner System32.

Ich habe eine andere Anwendung, die die Verwendung dieser DLL durch Initialisieren und Aufrufen von Funktionen von es testet. Diese Anwendung greift auf denselben BUFFER wie die DLL zu, indem sie diese externe Deklaration verwendet.

Zuerst, als ich den Visual Studio-Debugger zum Debuggen der Testanwendung verwendet habe, konnte ich den Inhalt des externen BUFFER aus der geladenen DLL sehen. Nach dem wiederholten Debuggen dieser Anwendung zeigt der BUFFER jetzt jedoch nicht seine Speicheradresse an, sondern nur "0x0000000", so dass ich die Daten nicht sehen kann.

Weiß jemand, warum das sein könnte? Ich kann nicht verstehen, warum es früher funktioniert hat, aber jetzt nicht. Ich habe überhaupt keinen Aspekt dieses Teils des Quellcodes geändert. Ist es OK, auf den BUFFER in der DLL zuzugreifen, indem Sie einen externen Zeiger wie diesen verwenden, oder gibt es einen besseren Weg?

Danke für Ihre Hilfe.

+0

Ich habe 'C++' und 'Visual-C++' zu Ihrer Frage getaggt, da es eher auftaucht als nur 'extern' :) –

+1

Ist es nur' extern' oder 'dllexport' /' dllimport'?Randnotiz: Der Aufruf von regsvr32 ist nur mit COM-DLLs sinnvoll. –

Antwort

0

Wenn Sie eine Variable mit extern deklarieren, dann bedeutet es nur deklarieren, aber nicht definieren (keine Speicherzuweisung für diese Variable), weil sie einen anderen Platz definiert. Sie deklarieren die Variable in Ihrer cpp-Datei mit DLL-Codes. Im Header mache es als extern mit dllexport/import und benutze es jetzt.

1

In C++ extern bedeutet, dass diese Variable in einer anderen * .cpp (Übersetzungseinheit) deklariert ist. Beispiel: myfile1.cpp:

int globalVariable = 0; 

myfile2.cpp:

extern int globalVariable; //same variable, because of extern 

Wenn Sie Export von dll benötigen, können Sie (in der Bibliothek) verwenden Dllexport müssen und Dllimport (in Bibliotheksverbraucher) für Funktionen und Variablen, zB: mylibrary.cpp:

__declspec(dllexport) int myGlobalExportingVariable = 0; 

myprogram.cpp:

__declspec(dllimport) int myGlobalExportingVariable; 

Natürlich in der realen Welt, würden Sie wahrscheinlich so etwas wie folgt verwenden: mylibrary.hpp:

#ifdef MYLIBRARY 
#define MYLIBRARY_ITEM __declspec(dllexport) 
#else 
#define MYLIBRARY_ITEM __declspec(dllimport) 
#endif 

MYLIBRARY_ITEM void func1(); 
MYLIBRARY_ITEM int variable0; 
MYLIBRARY_ITEM float func2(); 
//... 

Und Sie # include diesen Header in beiden mylibrary .cpp und myprogram.cpp; Vergessen Sie nicht, das Makro MYLIBRARY in Ihren Projekteinstellungen zu definieren (C++ -> Präprozessor -> Präprozessordefinitionen).

Übrigens: wie in Kommentar von PiotrLegnica hingewiesen, ist die Registrierung Ihrer DLL-Bibliothek mit regsvr32.exe sinnlos, es sei denn, Sie verwenden Technologie COM (Component Object Model).

+0

OK, danke, funktioniert jetzt gut. – darasan