いつもお世話になります。先日からフックについて質問させて頂いているものです
VC++6.0 MFCで開発しております。
先日から質問させて頂いたフック件で引き続き質問させて頂きたいことあります。
今は DLLでマウスフックを行い共有メモリを利用してメインアプリにメッセージを送信
しているのですが、マウスフック中にメモリリークが発生しています。
具体的には 今アプリは起動時にタスクトレイに格納され、タスクトレイのポップア
ップメニューから、処理を選択する形式をとっています。ところが そのポップアップメ
ニュー上でマウス動かしている間だけで メモリが蓄積されています。そこで以下の質
問があります。
1. 共有メモリを使用してでメモリリークの原因になることはありますか?またそれ
はどういうときに発生しますか??
2. 今 MouseHookのフックプロシージャーメソッドの開始時に共有メモリをOpen-
>Mappingして フックプロシージャーメソッドを抜ける直前にUnMapping を行っていま
すがこれは問題あるでしょうか??
※WM_MOUSEMOVEではまったく処理を記述していないので ここがおかしいのかと思っ
ているのですが、原因箇所がどこかがわかりません
3. そのほかに何か考えられる原因などはあるでしょうか??
以上ながながとなりましたが ご教授よろしくお願いします。
まずはどこまで調べたのか書きましょう
・何を見てリークしていると判断したのか
・開いたハンドルはハンドルは使い終わったらちゃんと閉じているか
・マップしている領域を大きくしていないか
Close は書かれていないようですが、きちんと閉じていますか。
<MSDN>
-- snip --
ファイルマッピングオブジェクトを完全に閉じるには、
UnmapViewOfFile 関数を呼び出してビューをすべてアンマップし、
さらに、CloseHandle 関数を呼び出してマッピングオブジェクトのハンドルを
閉じなければなりません。最初に UnmapViewOfFile を呼び出す必要があります。
ファイルマッピングオブジェクトのマップトビューは、内部で開いているハンドルと
オブジェクトの関連付けを維持しています。
-- snip --
</MSDN>
通りすがりさん。Banさん。ありがとうございます。
>何を見てリークしていると判断したのか
はい。これは タスクマネージャを開いて自アプリのメモリ消費量を見て、どんどん
増加しているので リークしていると判断しました
>マップしている領域を大きくしていないか
これはどういうことでしょうか??すいません。私の理解不足マップしている領域を
大きくするということがどのような現象かわかりません。
>開いたハンドルはハンドルは使い終わったらちゃんと閉じているか
>Close は書かれていないようですが、きちんと閉じていますか。
記述を忘れてました。フックプロシージャ内で Open-Mappingを行い抜ける際に
きちんとUnMapping-Closeの処理は記述しているのですが、なぜかメモリリークしてい
る次第であります
コードが提示されないのではなんとも…。概要だけなら問題無いのでは?
基本的なことを一々確認するしかないのですが、
unmapやcloseなどは成功してますよね。
呼び出し回数も想定道理に一致してますよね。
ハンドルの管理はどうしてますか。自動変数ですか。
追加、
そのメモリに何か書き込み・更新をしますか。
読みだしだけですか。
>共有メモリをOpen-Mappingして フックプロシージャーメソッドを抜ける直前に
UnMapping
使用しているAPI名は適当に略さず、そのまま書きましょう
今回は通じてるようですが、複数の実現方法がある場合など話がかみ合わなくなったりす
る原因になります
> タスクマネージャを開いて自アプリのメモリ消費量を見て、どんどん
> 増加しているので リークしていると判断しました
リークしているかもとは考えられますけれど、
この値を基準にして考えるのは不味いと思いますよ。
開放されたからといってタスクマネージャ上で減るかというと
必ずしもそうとは限りませんし。
きちんと確認を取るのであれば、それなりのツールが必要になります。
それでもどんどん増えているのであれば、リークの疑いは濃いと思いますけれど。
Banさん。略さないで… さん。ありがとうございます。
>コードが提示されないのではなんとも…。概要だけなら問題無いのでは?
お言葉ありがとうございます。私も提示しようかよく迷うのですが、どうにかして自
己解決できるように極力やめておこうかと考えています。最終的にどうしても解決でき
ない場合は ご協力頂くこともあると思いますが。そのときは是非よろしくお願いしま
す。
>呼び出し回数も想定道理に一致してますよね
>そのメモリに何か書き込み・更新をしますか。
>読みだしだけですか。
今 フックプロシージャ内を確認したところ 読みだしだけですしかしておりません。
しかし、詳しくチェックしたところ、
OpenFileMapping()、MapViewOfFile()を2度しているに対して
UnmapViewOfFile()、CloseHandle()処理が1度しか
されていませんでした。この場合当然メモリリークの原因になりますよね?
これが原因かと考えているのですが・・・どうでしょうか??
>使用しているAPI名は適当に略さず、そのまま書きましょう
すいません。以後気をつけます。ご指摘ありがとうございます。
少し話がそれますが、今 DLL側内でフックをクラス化していますが、このようなこと
はよくされるのでしょうか??それとも あまりクラスかすることは好ましくないので
しょうか??
サンプルとか見てますとほとんどが Dll内ででエクスポートされているのを伺うので
すが・・
以上 よろしくお願いします。
> されていませんでした。この場合当然メモリリークの原因になりますよね?
そうでしょうね。
追記
PATIOさん。ご意見ありがとうございます。返答を遅れましてすいませんでした。
>リークしているかもとは考えられますけれど、この値を基準にして考えるのは不味いと
>思いますよ。開放されたからといってタスクマネージャ上で減るかというと
>必ずしもそうとは限りませんし。
ありがとうございます。タスクマネージャの値だけで判断をしておりました。しかし
値はどんどん増加しています。
> きちんと確認を取るのであれば、それなりのツールが必要になります。
何かいいツールなどをご存知でしたら 是非教えて頂きたいと存じます。
>どうにかして自己解決できるように
たまに勘違いしている人がいますが、
ここで質問に回答をもらった時点で、他人の手を借りているのですから、
自己解決にはなっていません。
もちろんヒントだけで解決出来る方が望ましいです。(少なくとも技術的には)
その場合、ヒントをもらえるだけの充分な情報を出さなくてはいけません。
さらに、結果報告も的確なものが必要です。
# 確かに、最初から情報を提示されて「ヒントだけ欲しい」と書かれている方が、
# 基本的な確認事項とかをやり取りする手間が省けて、レス待ちが減るのは嬉しいかも知れません。
# 私見ですが。(今「そういう確認をしてまでレス書くのは…」って時はありますので。
現象の確認できる最小限のソースもしくは詳しい再現手順を示さずに、
現象の上っ面だけを書いてヒントをくれと言われても
想像で話すしかなくなり、非常に無駄が多くなると思いますが…
>OpenFileMapping()、MapViewOfFile()を2度しているに対して
>UnmapViewOfFile()、CloseHandle()処理が1度しか
>されていませんでした。この場合当然メモリリークの原因になりますよね?
>これが原因かと考えているのですが・・・どうでしょうか??
試してみましたか?
どうでしょうかと聞かれても、それを確認できるのはあなただけですよ…
(ソースが無いんですから)
REEさん。Banさん。ヒントといわれてもさん。
ご迷惑おかけしました。みなさんにご指摘を受けた点は今後気をつけてつけていきま
す。
また 今回の質問内容ですがやはり共有メモリの処理で Closeする処理が不足してい
たため メモリリークが発生していました。アドバイスありがとうございました。
また今後何かありましたらよろしくお願いします。本当にご迷惑おかけしました。