有名な 猫でもわかるプログロミング 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);
}
No.1ベストアンサー
- 回答日時:
グローバルフックしてるんなら
hHookを共有領域に置かないといけないんじゃない?
pragma data_seg
とか
.defファイルとかで調べればわかると思うよ。
ご指導ありがとうございます
(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の参照章の前後に同様なグローバルフックのサンプルが掲載されていますが、フックを共有領域化していません
なぜでしょうか???
再度宜しくお願い申し上げます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- オープンソース Flaskでサーバー立ち上げに関して 1 2023/08/12 21:02
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JOURNALRECORD 猫パンチでノッ...
-
1と表示させたいが12と表示される
-
C#のswitch文を簡略化したいの...
-
MessageBox()について
-
なぜCreateHatchBushの設定が途...
-
質問なのですが・・・
-
cocoa objective-c の return ...
-
c言語のリダイレクトによる円...
-
吸湿性のあるものを天秤で秤量...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
printf で二進表示を行いたい。
-
マイナスからプラスへ転じた時...
-
【C言語教えてください】sin波...
-
O(n log n)について2
-
エクセルのクイックアクセスツ...
-
「Aに対するBの割合」と「Aに対...
-
プログラムで関数は使わない方...
-
コンパイルエラーについて
-
hit&bolwのプログラミングがで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
音量調節
-
return文がない場合の戻り値は...
-
C#のswitch文を簡略化したいの...
-
ゲームとかの解像度変更&全画...
-
エラー Run-Time Check Failur...
-
コンソールアプリケーションの...
-
キャレットの現在位置の表示 (W...
-
COMPORTマルチスレッドで例外発生
-
エディットボックスの背景の色...
-
ツリーコントロールの開閉アイ...
-
C言語win32api、エディットボッ...
-
Win32APIにて、ウィンドウ全体...
-
Win32APIでウィンドウを中央に...
-
エディットコントロール入力時...
-
Win32のファイルダイアログのサ...
-
ダイアログプログラムでEnterキ...
-
不思議な現象が起こるプログラ...
-
C言語のswitch case文で、scanf...
-
WM_CREATE について
-
なぜCreateHatchBushの設定が途...
おすすめ情報