2011-01-11 9 views
0

Windows XPでMicrosoft Visual C++ 2010 Expressを使用しています。Extern point to 0x00000000

私はDLLを生成するアプリケーションを1つ持っています。このアプリケーションのヘッダーファイルは、BUFFERへのポインタをexternとして宣言しています。 このDLLをシステムに登録するには、system32フォルダ内のregsvr32.exeアイコンにドラッグします。

私は、このDLLの使用をテストし、そのDLLから関数を初期化して呼び出します。このアプリケーションは、このextern宣言を使用して、DLLと同じBUFFERにアクセスします。

まず、Visual Studioデバッガを使用してテストアプリケーションをデバッグすると、ロードされたDLLからextern BUFFERの内容がわかりました。しかし、このアプリケーションを繰り返しデバッグした後、BUFFERはそのメモリアドレスを表示しません。単に "0x0000000"なので、データを見ることはできません。

これは誰でも知っていますか?私はなぜそれが今まで働いていたのか理解できませんが、今はありません。私はこの部分のソースコードを一切変更していません。 このようなexternポインタを使ってDLLのBUFFERにアクセスしてもよろしいですか、それとも が良いですか?

ありがとうございました。

+0

「extern」ではなく「C++」と「Visual-C++」というタグが付いています:) –

+1

「extern」または「dllexport/dllimport」ですか?注:regsvr32の呼び出しは、COM DLLでのみ意味があります。 –

答えて

0

externで変数を宣言すると、その変数は他の場所を定義するため、変数を宣言するだけで、定義することはできません(その変数のメモリ割り当てはありません)。 dppコードでcppファイルの変数を宣言します。ヘッダーでは、dllexport/importを使用してexternとして作成し、使用します。

1

C++ externは、その変数が別の* .cpp(翻訳単位)で宣言されていることを意味します。 例: myfile1.cpp:

int globalVariable = 0; 

myfile2.cpp:

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

あなたはDLLから輸出する必要がある場合は、(ライブラリ内)のdllexportを使用しなければならないとDLLIMPORT(ライブラリのコンシューマで)関数と変数の例: mylibrary.cpp:

__declspec(dllexport) int myGlobalExportingVariable = 0; 

myprogram.cpp: mylibrary.hpp:もちろん

__declspec(dllimport) int myGlobalExportingVariable; 

、現実の世界では、おそらくこのようなもの使用することになり

#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(); 
//... 

をそして、あなたは、両方てMyLibraryでこのヘッダを#include .cppとmyprogram.cpp;あなたのプロジェクト設定(C++ - >プリプロセッサ - >プリプロセッサ定義)でMYLIBRARYマクロを定義することを忘れないでください。

ところで、PiotrLegnicaのコメントで指摘されているように、技術COM(コンポーネントオブジェクトモデル)を使用しない限り、regsvr32.exeでDLLライブラリを登録するのは無意味です。

+0

OK、ありがとうございました。 – darasan