質問させて頂きます。
現在、マウスフック用DLLを作成しております
DLL_PROCESS_ATTACHで、共有メモリを作成し
以降、フックプロシージャでは、作成した共有メモリの内部を元に処理を行っておりますが
現在、その処理がうまく行っておりません
例えば
typedef struct _tag_HOGEHOGE
{
HHOOK hHook;
BOOL bFlg;
} HOGEHOGE
のように、定義した構造体サイズの共有メモリを作成し
以降そのメモリは、OpenFileMapping->(HOGHOGE *)MapViewOfFileとしてアクセスします
フックプロシージャ内では、bFlgを基に処理をしており
bFlgがTRUEなら処理をするようにしています。
TRUEにする方法は、DLL内部関数を通す事で操作出来るようにしています(仮にsetDLLFlg関数で操作とします)
つまり、フックプロシージャ内で処理を行うときは、アプリ側で
setDLLFlg( TRUE );
のように、一度共有メモリのbFlgをTRUEにする必要があります
アプリ側では、必要な時にTRUEにして、必要の無いときはFALSEにして害を与えないようにしていますが
不思議な事に、TRUEとされていないのに、フックプロシージャ内部処理が動くときがあります
アプリ側にデバッガを通し、TRUEにするタイミングでブレークを貼ってみましたが
やはりアプリ側でTRUEにしていないのに、フックプロシージャ内部の処理が動きます
調べてみると、bFlgがいつの間にかTRUEになっております
このように、アプリ側が操作をしていないのに共有メモリの値が変わる場合、どのようなケースが考えられるでしょうか?
DLLのアタッチとデタッチの時の処理は以下の用にしています
case DLL_PROCESS_ATTACH:
/* 共有メモリを作成 */
g_hMapHandle = CreateFileMapping(
(HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
sizeof(HOGEHOGE),
TEXT("MAP_HOGEHOGE")
);
break;
case DLL_PROCESS_DETACH:
if( g_hMapHandle != NULL )
{
/* 共有メモリハンドルを破棄 */
CloseHandle( g_hMapHandle );
}
どうぞご教授の程、よろしくお願いします。
例えば・・・
#pragma data_seg("MAP_HOGEHOGE_DATA")
typedef struct _tag_HOGEHOGE
{
HHOOK hHook;
BOOL bFlg;
} HOGEHOGE
#pragma data_seg()
で、尚且つ・・・DEFファイルに
SECTIONS
MAP_HOGEHOGE_DATA READ WRITE SHARED
としたらどうなりますか?
※ 私は、これで問題なく動作しています。
因みにキーボードフックでです。
何をしているかと言えば、画面のキャプチャソフト
で使ってます。(自作)
以上。
をを〜一部間違い!
HOGEHOGEの実体を宣言している部分に
#pragma data_seg("MAP_HOGEHOGE_DATA")
// HOGEHOGEの実体宣言
#pragma data_seg()
として下さい。
以上。
う〜ん・・・
そうしたら共有メモリを作成する必要ありませんネ!
※ うっかりにもほどがある・・・
すいません・・・
以上。
オショウさん
レス有難うございます。
#pragma data_seg()
ですが、これを使わずに当初作成していました
その為、ファイルマッピングを用いて共有メモリを作成し
#pragma data_seg()を、共有メモリを用いる事で再現しています
>HOGEHOGEの実体を宣言している部分に
HOGEHOGE自体は、共有メモリの操作する方法なので
実体は
static HANDLE g_hMapHandle;
となっています
操作時は、OpenFileMapping->(HOGHOGE *)MapViewOfFileとして
操作毎に、共有メモリにアクセスして、マップを操作しています
この場合でも、
static HANDLE g_hMapHandle;
を#pragma data_seg()を利用するのは有効なのでしょうか?
やはり、共有メモリを用いずに
初めから、#pragma data_seg()を使うべきでしょうか?
#pragma data_seg("MAP_HOGEHOGE_DATA")
HHOOK hHook;
BOOL bFlg;
#pragma data_seg()
としてDEFファイルにも定義するのが、随分昔に
マイクロソフト社の何かのサンプルで見た覚え
があり、ずっと踏襲してます。
次にパッキングの設定くらいかな〜・・・
私は共有メモリ(CreateFileMapping)を使わず
上記の方法で、延々やってきました。
問題(トラブル)も無かったです。
● 気になることが1点・・・
DLL_PROCESS_ATTACHで、CreateFileMapping
されてますが、その際のハンドル(g_hMapHandle)
は、DLL_PROCESS_DETACH時のCloseHandleにしか
使わないようになっていますか?
要は、書かれている通り、毎回MapViewOfFile
してポインタを取得して動作させていることには
間違いがないのか・・・
※ 勝手に書き変わる・・・
と言うならば、パッキングくらいしか無いように
思いますが、摩訶不思議ですネ・・・
※ #pragma data_seg()で宣言してもDEFファイルに
READ WRITE SHARED属性定義しないと、正しく動
作しませんでした。
以上。
ツイート | ![]() |