【原】pragma data_についてseg()はデータを共有できません
1771 ワード
最近このメソッドを使ってデータを呼び出すのは無効ですが、同じように困っている人に助けてほしいですね~
いくつかの資料を調べて、ちょうどプロジェクトの中で他の人と一緒に私が書いたDLLファイルを呼び出します.
コードに次のように書き込みます.
現在、このDLL共有データセグメントが呼び出されているのは、プロジェクトAのbプロセスである.
次に、プロジェクトBのcプロセスを作成する
b,cプロセスは同時に「s_data」セグメントを静的に呼び出す
bプロセス実行
cプロセス実行
2つのプロセスの実行
共有に失敗し、cプロセスguiCurrentPage変数はbプロセス変数に従って変更されませんでした.
DLLの原理は次のとおりです.
WINシステムはシステムメモリにDLLデータが1部しか存在しないことを保証し、異なるプロセスはMMCが自分のためにマッピングした4 GB(32 bit)空間内で呼び出すコードをこの唯一の空間アドレスにマッピングし、DLL中のグローバル変数は異なるコピーでプロセス自身のメモリ空間にマッピングし、このようにDLLの完全な分離を実現し、プロセス間呼び出しDLLは完全に干渉しない
使用#pragma data_seg()後,DLLは実際の物理アドレスのメモリ空間に定義セグメント間データを1部だけ保持し,データを共有できるようになった.
長い間詰まっていましたが、注意すべき文法の問題には次のようなものがあります.
1.#pragma data_seg(「section名」)section名は8バイト未満でなければ切断されません(これはヘッダ、テールが一致して切断された後も一致し、問題ありません)
2.変数は初期化する必要があります.そうしないと、コンパイラによって最適化されます.bssセグメント
3.#pragma comment(linker,"/SECTION:s_data,RWS")での大文字と小文字の問題
すべて繰り返しの修正をして、すべて無効です
私の上記の試験方法に注意してください.
Aプロジェクトbプロセス、Bプロジェクトcプロセス
同じDLLの2つの異なるコピーでもだめなのか、
そこで二つのプロセスをexeファイルとDLLファイルを同じディレクトリにコピー
うんてん
通過する.
結論:異なるパスで同じ名前の2つのDLLファイルは、プロセス呼び出しを表示するDLLファイル名が同じDLLファイルであっても、システムによって同じDLLファイルと見なされません.
いくつかの資料を調べて、ちょうどプロジェクトの中で他の人と一緒に私が書いたDLLファイルを呼び出します.
コードに次のように書き込みます.
#pragma data_seg("s_data") // ,
unsigned int guiCurrentPage = 255;
#pragma data_seg()
#pragma comment(linker,"/SECTION:s_data,RWS")
現在、このDLL共有データセグメントが呼び出されているのは、プロジェクトAのbプロセスである.
次に、プロジェクトBのcプロセスを作成する
b,cプロセスは同時に「s_data」セグメントを静的に呼び出す
bプロセス実行
Sleep(700);
guiCurrentPage++;
cout<<"PageNo. is "<<dec<<guiCurrentPage<<endl;
cプロセス実行
Sleep(500);
cout<<"PageNo. is "<<dec<<guiCurrentPage<<endl;
2つのプロセスの実行
共有に失敗し、cプロセスguiCurrentPage変数はbプロセス変数に従って変更されませんでした.
DLLの原理は次のとおりです.
WINシステムはシステムメモリにDLLデータが1部しか存在しないことを保証し、異なるプロセスはMMCが自分のためにマッピングした4 GB(32 bit)空間内で呼び出すコードをこの唯一の空間アドレスにマッピングし、DLL中のグローバル変数は異なるコピーでプロセス自身のメモリ空間にマッピングし、このようにDLLの完全な分離を実現し、プロセス間呼び出しDLLは完全に干渉しない
使用#pragma data_seg()後,DLLは実際の物理アドレスのメモリ空間に定義セグメント間データを1部だけ保持し,データを共有できるようになった.
長い間詰まっていましたが、注意すべき文法の問題には次のようなものがあります.
1.#pragma data_seg(「section名」)section名は8バイト未満でなければ切断されません(これはヘッダ、テールが一致して切断された後も一致し、問題ありません)
2.変数は初期化する必要があります.そうしないと、コンパイラによって最適化されます.bssセグメント
3.#pragma comment(linker,"/SECTION:s_data,RWS")での大文字と小文字の問題
すべて繰り返しの修正をして、すべて無効です
私の上記の試験方法に注意してください.
Aプロジェクトbプロセス、Bプロジェクトcプロセス
同じDLLの2つの異なるコピーでもだめなのか、
そこで二つのプロセスをexeファイルとDLLファイルを同じディレクトリにコピー
うんてん
通過する.
結論:異なるパスで同じ名前の2つのDLLファイルは、プロセス呼び出しを表示するDLLファイル名が同じDLLファイルであっても、システムによって同じDLLファイルと見なされません.