2011年8月22日月曜日

DLLの共有セクションを使う場合の注意点

グローバルフックを使用するときなど、複数のプロセスでデータを共有するために、DLLの共有セクションを使う場合がある。
この時、共有する変数は宣言と同時に明示的に初期化しなければ、共有されないので注意すること。

#pragma comment(linker, "/SECTION:.SHAREDMEM,RWS")
#pragma data_seg(".SHAREDMEM")
int shared_ng;                                //NG
int shared_ok = 0;                            //OK
struct shared_struct shared_struct_ng;        //NG
struct shared_struct shared_struct_ok ={0};   //OK
#pragma data_seg()

初期化していないグローバル変数は自動的に0に初期化されることになっているわけだけど、このためにBSSという専用のセクションが用意されていて、スタートアップルーチンでクリア処理が走る。
そのため、初期化をしていない変数はせっかく用意した共有用のデータセグメントではなく、BSSセクションに置かれてしまい共有できないということらしい。

0 件のコメント:

コメントを投稿