- ベストアンサー
一般保護エラーが発生する問題への対処方法
- 一般保護エラーが発生するDLLを使用している際に発生するエラーの対処方法について。
- エラーメッセージや未保存のデータが表示される際に一般保護エラーが発生する。
- ファイル操作時やキーボード操作時に一般保護エラーが発生する場合がある。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ソース見ました。 CallNextHookEx()の第一引数がなぜNULLなんですか? 私はVC++なんでわからないのですが、Borland C++では、共有領域のところに確保して、メモリはプロセス間でも共有可能なのですか?リンカで指定済みでしょうか? そうしないとフックハンドルを他のプロセスに渡せないと思うんですが。 逆に、そのソースの記述でOKなのであれば、エントリポイントが呼ばれるたびにhInsDLLが上書きされると思いますけど。 あと、キーボードフックのサンプルはこちらをどうぞ。 http://kumei.ne.jp/c_lang/sdk2/sdk_160.htm グローバルフックの参考に。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>1:フックはWH_GETMESSAGEを使っています。 >本来はWH_KEYBOARDを使うべきなのですが、 >こちらだと何故か上手く機能してくれません。 >現象として、キーの判定を行ってくれない時があるのです。 さすがにこれは、ソースを見ないとなんとも。 >2:タイマで監視とはフックを行う関数とは別に関数を作り >これをタイマで随時呼び出しています。 なぜタイマーなんでしょう? タイマーの間隔に複数のメッセージを処理する必要が出てきたらどうするのでしょう? こういうときは、自アプリにウィンドウを作成し、処理対象のメッセージがきたら、自アプリにWM_USER等のメッセージを送って処理をさせましょう。 >3:DLLの中です。 >この値を2番でいっている監視を行う関数で >アプリケーション側に渡しています。 ちゃんと共有メモリになってますか? あと、落ちるのは、フックプロシージャの処理がおかしい気がします。 できたらソースがあると分かりそうなのですが・・・
補足
いや、一般保護エラーが出ても落ちるわけじゃあないんです。 起きる時は8回連続で出てき、4回目と5回目の間に一瞬だけ間があります。 このことからしてフックプロシージャの処理に問題があるとこは分かります。 ソースは結構大きいのでダウンロードできるようにしておきました。 ここから持ってきて問題を指摘してください。 お願いします。 http://homepage3.nifty.com/ZOIDS/down/down.html
- taka_tetsu
- ベストアンサー率65% (1020/1553)
補足をお願いします。 >SetWindowsHookExを使って非アクティブになっているアプリケーションを >キーボードによる操作できるDLLを作ったのですが、 どのような操作を行いたいのでしょうか? フックはWH_KEYBOARDですか? >2:特定関数をアプリケーション側でタイマコントロールによる監視をし、キーボード操作の識別を行う。 よく分からないのですが。 関数をタイマで監視とはどのような処理でしょう? >3:キー識別のためにグローバル変数を使用している。 これは、DLLの中ですか? グローバルフックをかけているのであれば、プロセス間で メモリを共有できるようにする必要があるはずですが。 >4:操作に必要なキー以外が押されていれば-1を返す。 フックプロシージャの戻り値は、CallNextHookEx()の戻り値では?
補足
申し訳ありません。 字数制限の関係でソース公開できなかったために 説明不足になってしまいました。 もう少し詳しく書きます。 1:フックはWH_GETMESSAGEを使っています。 本来はWH_KEYBOARDを使うべきなのですが、 こちらだと何故か上手く機能してくれません。 現象として、キーの判定を行ってくれない時があるのです。 2:タイマで監視とはフックを行う関数とは別に関数を作り これをタイマで随時呼び出しています。 3:DLLの中です。 この値を2番でいっている監視を行う関数で アプリケーション側に渡しています。 4:フックプロシージャの戻り値はCallNextHookEx()の戻り値を返しています。 ここでいっている返し値はフックプロシージャの中でキー判定をして、 3番でいっているグローバル変数に格納しています。 このソフトのために始めてフックを使うので、 非効率な作りになってしまい問題があるのだと思います。 サンプルがあれば幸いなのですが、 キー操作のサンプルは見つかりませんでした。 後、エラーはいつ起きるか分からないので連絡は遅くなってしまいます。 その辺はご了承ください。
お礼
元にしたサンプルがWINキーを無効化すると言うものだったのでそれが良くなかったのかもしれません。 キー無効化はDLL内だけで出来ますけど、キー操作はDLL内だけでは出来ませんから。 教えてくれたサイトのサンプルを元にいろいろやってみます。 分かりにくい説明に付き合ってくれてありがとうございました。