こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

作ったDLLで一般保護エラーがでます。

SetWindowsHookExを使って非アクティブになっているアプリケーションを
キーボードによる操作できるDLLを作ったのですが、
時々DLLが一般保護エラーを起こします。
しかも常に一般保護エラーが起きるわけで無く、起きない時もあります。
発生条件は全くの不明なのです。


一般保護エラーが起きる状態の時は以下の操作をすると起きます。

1:エラーメッセージやエディタで未保存のデータの時に出てくる
ダイアログボックスが表示された時。

2:エクスプローラーをアクティブにしてキーボードを押すことによって
押したキーの文字をファイル名の頭文字とするファイルへのショートカットをする際、
押したキーの文字を頭文字とするファイルが無い時

の2点が分かっています。


プログラムの概要は次のとうりです。
1:WINDOWSキー+F9~12で操作をする。
2:特定関数をアプリケーション側でタイマコントロールによる監視をし、キーボード操作の識別を行う。
3:キー識別のためにグローバル変数を使用している。
4:操作に必要なキー以外が押されていれば-1を返す。
5:DLLはBorland C++で作成し、アプリケーションはBorland C++Builder 5で作成。
です。

ソースは字数制限の関係で書けませんでした。

投稿日時 - 2003-05-18 15:00:28

QNo.550887

暇なときに回答ください

質問者が選んだベストアンサー

ソース見ました。

CallNextHookEx()の第一引数がなぜNULLなんですか?


私はVC++なんでわからないのですが、Borland C++では、共有領域のところに確保して、メモリはプロセス間でも共有可能なのですか?リンカで指定済みでしょうか?

そうしないとフックハンドルを他のプロセスに渡せないと思うんですが。

逆に、そのソースの記述でOKなのであれば、エントリポイントが呼ばれるたびにhInsDLLが上書きされると思いますけど。


あと、キーボードフックのサンプルはこちらをどうぞ。
http://kumei.ne.jp/c_lang/sdk2/sdk_160.htm

グローバルフックの参考に。

参考URL:http://kumei.ne.jp/c_lang/sdk2/sdk_160.htm

投稿日時 - 2003-05-22 16:25:57

お礼

元にしたサンプルがWINキーを無効化すると言うものだったのでそれが良くなかったのかもしれません。
キー無効化はDLL内だけで出来ますけど、キー操作はDLL内だけでは出来ませんから。

教えてくれたサイトのサンプルを元にいろいろやってみます。
分かりにくい説明に付き合ってくれてありがとうございました。

投稿日時 - 2003-05-22 21:12:17

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>1:フックはWH_GETMESSAGEを使っています。
>本来はWH_KEYBOARDを使うべきなのですが、
>こちらだと何故か上手く機能してくれません。
>現象として、キーの判定を行ってくれない時があるのです。

さすがにこれは、ソースを見ないとなんとも。


>2:タイマで監視とはフックを行う関数とは別に関数を作り
>これをタイマで随時呼び出しています。

なぜタイマーなんでしょう?
タイマーの間隔に複数のメッセージを処理する必要が出てきたらどうするのでしょう?

こういうときは、自アプリにウィンドウを作成し、処理対象のメッセージがきたら、自アプリにWM_USER等のメッセージを送って処理をさせましょう。

>3:DLLの中です。
>この値を2番でいっている監視を行う関数で
>アプリケーション側に渡しています。

ちゃんと共有メモリになってますか?


あと、落ちるのは、フックプロシージャの処理がおかしい気がします。

できたらソースがあると分かりそうなのですが・・・

投稿日時 - 2003-05-21 01:34:46

補足

いや、一般保護エラーが出ても落ちるわけじゃあないんです。
起きる時は8回連続で出てき、4回目と5回目の間に一瞬だけ間があります。
このことからしてフックプロシージャの処理に問題があるとこは分かります。
ソースは結構大きいのでダウンロードできるようにしておきました。
ここから持ってきて問題を指摘してください。
お願いします。
http://homepage3.nifty.com/ZOIDS/down/down.html

投稿日時 - 2003-05-21 21:43:43

ANo.1

補足をお願いします。

>SetWindowsHookExを使って非アクティブになっているアプリケーションを
>キーボードによる操作できるDLLを作ったのですが、

どのような操作を行いたいのでしょうか?
フックはWH_KEYBOARDですか?


>2:特定関数をアプリケーション側でタイマコントロールによる監視をし、キーボード操作の識別を行う。

よく分からないのですが。
関数をタイマで監視とはどのような処理でしょう?

>3:キー識別のためにグローバル変数を使用している。

これは、DLLの中ですか?
グローバルフックをかけているのであれば、プロセス間で
メモリを共有できるようにする必要があるはずですが。

>4:操作に必要なキー以外が押されていれば-1を返す。

フックプロシージャの戻り値は、CallNextHookEx()の戻り値では?

投稿日時 - 2003-05-19 02:03:01

補足

申し訳ありません。
字数制限の関係でソース公開できなかったために
説明不足になってしまいました。
もう少し詳しく書きます。

1:フックはWH_GETMESSAGEを使っています。
本来はWH_KEYBOARDを使うべきなのですが、
こちらだと何故か上手く機能してくれません。
現象として、キーの判定を行ってくれない時があるのです。


2:タイマで監視とはフックを行う関数とは別に関数を作り
これをタイマで随時呼び出しています。

3:DLLの中です。
この値を2番でいっている監視を行う関数で
アプリケーション側に渡しています。

4:フックプロシージャの戻り値はCallNextHookEx()の戻り値を返しています。
ここでいっている返し値はフックプロシージャの中でキー判定をして、
3番でいっているグローバル変数に格納しています。


このソフトのために始めてフックを使うので、
非効率な作りになってしまい問題があるのだと思います。
サンプルがあれば幸いなのですが、
キー操作のサンプルは見つかりませんでした。

後、エラーはいつ起きるか分からないので連絡は遅くなってしまいます。
その辺はご了承ください。

投稿日時 - 2003-05-19 23:27:33

あなたにオススメの質問