有名な 猫でもわかるプログロミング Windows SDK編 第2部 第165章 ジャーナルレコードとプレイバックその2
http://homepage2.nifty.com/c_lang/sdk2/sdk_165.htm
で勉強させて頂いております
親プログラムのメニューを押下するとDLLのStartRecord()に来ます(1)
その中でSetWindowsHookEx()を呼びますが、戻り値のhHookがNULLになってしまいます(2)
そこでエラー情報を表示(//*の部分)させると『アクセスが拒否されました』となります
SetWindowsHookEx()のアクセス拒否の原因をネットで調べてみましたが何処にも記載が見つかりません
もう3日も嵌まり込んでいます、教えてください、お願いします
なおコードは親プログラム・DLLともにマルチバイトを指定しております
#include <windows.h>
#include "hook04x.h"
#define MAX_RECORD 2000
HINSTANCE hInst;
HHOOK hHook;
HWND hWnd;
BOOL bHook = FALSE; //フック中
BOOL bRecord = FALSE; //記録済かどうか
int n;
EVENTMSG MyEvent[MAX_RECORD];
DWORD dwStart;
DWORD dwAdjust;
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
{
hInst = hInstance;
return TRUE;
}
//単にこのdllのインスタンスハンドルをグローバル変数にコピーしているだけです。
EXPORT BOOL StartRecord() .........(1)
{
memset(MyEvent, 0, sizeof(EVENTMSG));//構造体を0で初期化
//*LPVOID lpMsgBuf;
//*SetLastError(NO_ERROR); //エラー情報をクリアする
hHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)MyHookProc, hInst, 0); ....(2)
//*FormatMessage( //エラー表示文字列作成
//*FORMAT_MESSAGE_ALLOCATE_BUFFER |
//*FORMAT_MESSAGE_FROM_SYSTEM |
//*FORMAT_MESSAGE_IGNORE_INSERTS,
//*NULL, GetLastError(),
//*MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
//*(LPTSTR) &lpMsgBuf, 0, NULL);
//*MessageBox(NULL, (const char*)lpMsgBuf, NULL, MB_OK); //メッセージ表示//* LocalFree(lpMsgBuf);
if (hHook == NULL)
{
MessageBox(hWnd, "JOURNALRECORDフックに失敗しました", "Error", MB_OK);
return FALSE;
}
dwStart = GetTickCount();
n = 0;
bHook = TRUE;
bRecord = TRUE;
return TRUE;
}
EXPORT BOOL StartPlay()
{
【途中省略】
EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
EVENTMSG *lpEM;
if (nCode == HC_ACTION) {
lpEM = (EVENTMSG *)lp;
if (lpEM->message == WM_KEYDOWN && LOBYTE(lpEM->paramL) == VK_CANCEL) {
PostMessage(hWnd, WM_RECORD_END, 0, 0);
PostMessage(hWnd, WM_END_HOOK, 0, 0);
return TRUE;
}
MyEvent[n].hwnd = lpEM->hwnd;
MyEvent[n].message = lpEM->message;
MyEvent[n].paramH = lpEM->paramH;
MyEvent[n].paramL = lpEM->paramL;
MyEvent[n].time = lpEM->time;
n++;
if (n >= MAX_RECORD-1) {
PostMessage(hWnd, WM_RECORD_MAX, 0, 0);
PostMessage(hWnd, WM_END_HOOK, 0, 0);
return TRUE;
}
return TRUE;
}
return CallNextHookEx(hHook, nCode, wp, lp);
}
お礼
ご指導ありがとうございます (1) わたしもその辺りと思ってフックを共有領域に設定し初期化しました(******の所) #include <windows.h> #include "hook04x.h" #define MAX_RECORD 2000 HINSTANCE hInst; //共有領域 *************** #pragma data_seg(".sharedata") HHOOK hHook=0; #pragma data_seg() HWND hWnd; BOOL bHook = FALSE; //フック中 BOOL bRecord = FALSE; //記録済かどうか int n; EVENTMSG MyEvent[MAX_RECORD]; DWORD dwStart; DWORD dwAdjust; またDEFファイルを以下の内容で作り、hook04x.defとの名称でDLLソースと同じパスに入れました LIBRARY SECTIONS .sharedata READ WRITE SHARED コンパイルとリンクにはエラーがありません でも実行すると全く同じで『アクセスが拒否されました』となってしまいます (2) 猫でもわかるプログラミングにはJOURNALRECORDの参照章の前後に同様なグローバルフックのサンプルが掲載されていますが、フックを共有領域化していません なぜでしょうか??? 再度宜しくお願い申し上げます