2011-06-21 6 views
1

私が間違っている場合は、私を修正してください。 質問は、WindowsコンソールアプリケーションのC++に関連しています。実行可能ファイルのDLLメモリマッピングまたはアドレス空間割り当て

abc.exedef.exeという2つのアプリケーションと、Funky.dllというDLLを作成しました。私はDLLを場所C:\Funky.dllに保存しました。

DLLにグローバル文字列変数があります。 "文字列値;" そして、Dlls公開関数はその変数を使用しています。以下

DLLコードである:

#include<header files etc> 

string Value; 

#ifdef _MANAGED 
#pragma managed(push, off) 
#endif 

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 


    return TRUE; 
} 

#ifdef _MANAGED 
#pragma managed(pop) 
#endif 

extern "C" __declspec(dllexport) string Display(string str, int val) 
{ 

    value=str; 
    cout<<"\n************I am in a FunkyDLL************\n"; 
    cout<<"\n"<<value; 
    cout<<"\n"<<val; 
    printf("\nAddress Space %u::",&value); 



return value; 
} 

は今は2つの異なるアプリケーション(すなわちabc.exedef.exe)から同じDLLにアクセスしていますが、DLLの位置は同じである、すなわち、c:\Funky.dll。 whileループの両方のアプリケーションでDisplay関数を呼び出します。 abc.exe用:

while(1) 
{ 
Display("ABC",10); 
} 

def.exe用:

while(1) 
{ 
Display("DEF",10); 
} 

次に、異なるアプリケーションに対して異なる値を印刷表示機能。しかし、変数のアドレスは常に同じです。

実行可能ファイルにDLLのアドレス空間に関連するリンクを説明したり、提供したりできますか?

ありがとうございます。

答えて

1

はあなたのDLLを使用する各プロセスは、DLLのグローバル変数と静的変数の独自のコピーを持っていwikipedia

1

を参照してください。プロセス間でデータを共有するには、複数のアプローチの1つを手動で適用する必要があります。最も頻繁に使用されるのは、DLL内またはメモリマップファイルAPIを使用して共有セクションを作成することです。

さらに良いMSDN(starting point)上に注意深く読むすべてのDLL関連の材料と - リヒターの「Windows用のプログラミングのaplications」のコピーを取得

関連する問題