none
Win32APIプログラムの終了時にエラーになります

    質問

  • Visual Studio community 2017を使用して、Win32APIのプログラムを作ろうとしていますが、Visual Studioで自動生成されるプログラムに何も手を加えていないのに、ウィンドウを閉じるとエラーになることがあります。
    Visual Studioを再インストールしてみましたが、直りません。解決策についてご教示いただきたく、また解決策でなくても、原因を調べるために何かやってみることがあったら、教えていただきたく、よろしくお願いします。
    当方は、Win32APIは初心者ですので、よろしくお願いします。

    1.プロジェクトの作成と、行った操作について
    (1)「新規作成」→「プロジェクト」で「Win32プロジェクト」を選択し、「場所」と「名前」を設定後、「OK」釦を押す。
    (2)「次へ」釦を押して、「Windowsアプリケーション」が選択されていることを確認して「完了」釦を押す。
    (3)自動生成されたプログラムをビルドし、デバッグ実行する。
    (4)ウィンドウが表示されたら、ウィンドウ右上の「×」釦を押して終了する。

    2.現象
    (1)ウィンドウの終了操作を行うと、3項のエラーメッセージが表示されることがあります。
    (2)発生頻度は多い時で2、3回に1回、少ない時で10回に1回程度です。

    3.表示されるエラーメッセージ
    (1)「例外がスローされました」というタイトルのダイアログに「0x73F13298 (tmmon.dll) で例外がスローされました (Win32Project1.exe 内): 0xC0000005: 場所 0x00891B78 の読み取り中にアクセス違反が発生しました」などと表示されます。
    (2)ダイアログの背後には、「tmmon.pdbは読み込まれていません」と大きな文字で表示されます。

    OSはWindows 10 Pro. 64ビットです。以上、よろしくお願いします。

    2017年3月28日 6:28

回答

  • 「tmmon.dll」はトレンドマイクロのDLLの様なので、そちらに問い合わせた方が良いかもしれません。
    2017年3月28日 6:35
  • クリーン ブート環境でエラーが発生するか、確認されることをお勧めします。
    ---------------------------------------
    Windows でクリーン ブートを実行する方法
    https://support.microsoft.com/ja-jp/help/929135/how-to-perform-a-clean-boot-in-windows
    ---------------------------------------
    2017年3月28日 6:54
  • Windows Update でシステムを最新状態に更新し、かつウィルス バスターも最新状態に更新して、再度確認されることをお勧めします。
    あと下記サイトから "Process Explorer" をダウンロードし、エラーが発生するケースと発生しないケースそれぞれで、該当プロセス (問題の自作アプリ) に "tmmon.dll" モジュールがロードされているか否かを確認したほうが良いと思います。

    -------------------------------------
    Process Explorer v16.2
    https://technet.microsoft.com/en-us/sysinternals/processexplorer.aspx?f=255&MSPPError=-2147217396
    --------------------------------------

    エラーが発生しないケースで "tmmon.dll" モジュールがロードされていないのであれば、ウィルスバスターに起因している可能性がかなり高いと考えられますが、該当プロセスにトレンドマイクロ社以外の 3rd ベンダー製モジュールがロードされていなか、しっかり確認する必要があると思います。

    個人的な感想ですが。。。。
    仮にもプログラム開発者なんだから、いきなり他者を疑う前にしっかり切り分け調査をして、少なくとも自身の潔白を主張できる根拠を見つけてから、他社に問い合わせましょうよ。。。
    ライブ デバッグするとか、WER でプロセス クラッシュ時のダンプを採取して、それをベースに調査方針を立てるとか。。。まだまだ自力でできることがたくさんあると思いますよ。

    2017年3月28日 9:52
  • 知らなかったら、知る努力をすればいいいだけなので、いちいち謝る必要はありません。

    ☆ Process Explorer について
    操作および確認方法は、概ね提示されている手順で問題ないのですが、私がこの確認を提案した背景を説明しておきます。
    個々のプロセス (アプリ, サービス, etc.) の仮想メモリ空間にロードされる DLL には、大きく分けて2種類あります。
    1つは個々の exe, dll ファイルの PE (Portable Executable) ヘッダー内で指定されている DLL 群で、もう1つはサービス等の外部プロセスから DLL Injection でロードされる DLL 群です。
    (先の返信で "クリーン ブート" での検証を提案したのは、後者 DLL Injection の影響を排除するためです。)
    "tmmon.dll" はトレンドマイクロ社が提供している DLL なので、自作アプリ(Win32Project1.exe)プロセス内にロードされたこの DLL は、トレンドマイクロ社製の何かのサービス プロセスによって DLL Injection されたと考えられます。
    で、DLL Injection されるモジュールは、インストールされているソフトウェアに依存して変化する可能性があります。
    つまり PC 環境ごとに DLL Injection されるモジュールは変化することがあるのです。
    異なる 3rd ベンダー製サービスが複数の DLL Injection を行っている場合、注入されたお互いの DLL が干渉し、潜在的なバグが表面化することも多々あるのです。
    あくまでも私見ですが、今回の問題も "tmmon.dll" 単体の原因ではなく、他の 3rd ベンダー製 DLL も関与しているのでは。。。というのが私の推測です。
    (Google 先生に質問しても、過去数カ月に "tmmon.dll" が原因で "0xC0000005" のクラッシュした事例は見当たらなかったので。)
    Process Explorer では、個々のプロセス内にロードされている DLL 一覧を確認することができるので、問題が起きるときと起きないときで、自作アプリ(Win32Project1.exe)プロセス内にロードされる DLL にどのような変化があるのか、きちんと精査されることをお勧めします。

    ☆ ライブ デバッグおよびダンプについて
    ライブ デバッグやダンプ解析は、確かにある程度の専門的な知識が必要になりますが、それを行うツール類に関しては「タダ」で手に入るので、誰でも挑戦できます。
    例えば、WER でアプリ クラッシュにプロセス ダンプを生成する設定を行い、それにより得られたダンプ ファイルをこちらから指示する方法で解析することも可能だと思います。
    そのダンプ解析ログを提示すれば、それを理解できる人が見れば、返信してくれるかもしれません。
    (私の知る限り、このフォーラムでもダンプ ログを見れる方が数名いらっしゃいます。)
    ダンプ解析に挑戦する根性があるのでしたら、お手伝いします。
    (ただしお役に立てるかどうかは、保証の限りではありません。)
    2017年3月29日 2:59

すべての返信

  • 「tmmon.dll」はトレンドマイクロのDLLの様なので、そちらに問い合わせた方が良いかもしれません。
    2017年3月28日 6:35
  • 返信ありがとうございます。トレンドマイクロに問い合わせてみます。
    2017年3月28日 6:40
  • クリーン ブート環境でエラーが発生するか、確認されることをお勧めします。
    ---------------------------------------
    Windows でクリーン ブートを実行する方法
    https://support.microsoft.com/ja-jp/help/929135/how-to-perform-a-clean-boot-in-windows
    ---------------------------------------
    2017年3月28日 6:54
  • ありがとうございます。やってみます。ただ、クリーンブートというのは初めてなので、少し時間をください。結果が出たら報告します。

    2017年3月28日 7:21
  • クリーンブートの設定で、「システム構成」の「サービス」でマイクロソフト以外のサービスをすべて「無効」に設定しましたが、Windowsを再起動すると、無効にした「サービス」の中の「Trend Micro Solution Platform」だけが「実行中」になっていました。これでよいのか、良くわからないのですが、この状態でVisual Studioを操作したところ、一発で問題のエラーが発生しました。

    ウィルスバスターを停止してみようと思いましたが、タスクバーの右端の「隠れているインジケータを表示」しても、ウイルスバスターのアイコンはなく、ウィルスバスターの停止もできません(?)。「隠れているインジケータを表示」しても「USB」のアイコン1個だけが表示されていて、その他のアイコンは全て表示されません。ウィルスバスターも止まっているのでしょうか。

    2017年3月28日 7:55
  • ウィルスバスターとの関連について

    クリーンブートを通常のブートに戻してWindowsを立ち上げ、ウィルスバスターだけを停止して、Visual Studioを操作したところ、30回やってもエラーは出ませんでした。

    そこで、ウィルスバスターを再度起動してVisual Studioを操作したら、2回目に問題のエラーが発生しました。どうもウィルスバスターが怪しい感じですが、この件も含めてトレンドマイクロに問い合わせたいと思います。トレンドマイクロから回答があったらまた報告したいと思います。

    2017年3月28日 8:58
  • Windows Update でシステムを最新状態に更新し、かつウィルス バスターも最新状態に更新して、再度確認されることをお勧めします。
    あと下記サイトから "Process Explorer" をダウンロードし、エラーが発生するケースと発生しないケースそれぞれで、該当プロセス (問題の自作アプリ) に "tmmon.dll" モジュールがロードされているか否かを確認したほうが良いと思います。

    -------------------------------------
    Process Explorer v16.2
    https://technet.microsoft.com/en-us/sysinternals/processexplorer.aspx?f=255&MSPPError=-2147217396
    --------------------------------------

    エラーが発生しないケースで "tmmon.dll" モジュールがロードされていないのであれば、ウィルスバスターに起因している可能性がかなり高いと考えられますが、該当プロセスにトレンドマイクロ社以外の 3rd ベンダー製モジュールがロードされていなか、しっかり確認する必要があると思います。

    個人的な感想ですが。。。。
    仮にもプログラム開発者なんだから、いきなり他者を疑う前にしっかり切り分け調査をして、少なくとも自身の潔白を主張できる根拠を見つけてから、他社に問い合わせましょうよ。。。
    ライブ デバッグするとか、WER でプロセス クラッシュ時のダンプを採取して、それをベースに調査方針を立てるとか。。。まだまだ自力でできることがたくさんあると思いますよ。

    2017年3月28日 9:52
  • ご教示ありがとうございます。ご指摘いただいたことを1つずつやってみたいと思います。思いますが、何せ初心者なもので、すぐにできることと、できないことがあります。

    1.Windows Updateとウィルスバスターを最新にする

      ご指摘のことをやってみたいと思います。

    2.Process Explorer

      何せ初めてで、良くわからないのですが、できるところまででもやってみたいと思います。

    3.ライブ デバッグするとか、WER でプロセス クラッシュ時のダンプを採取

      勉強不足ですみません。何のことやらさっぱりわかりません。調べてみますが、もう少し具体的にご教示いただけるとありがたいです。

    2017年3月28日 10:50
  • Windows Updateとウィルスバスターを最新にする件

    Windows、ウィルスバスターともに最新ではなかったため、最新の状態にアップデートしました。ですが、現象は同じでした。ウィルスバスター起動時は3回目にエラーとなりましたが、ウィルスバスター終了時は30回やってもOKでした。

    Process Explorerについては、調べてやってみますので時間をください。

    2017年3月28日 12:10
  • Process Explorerについて

    1.操作手順
      Process Explorerをインストール後、次のように操作しました。これでよいと思うのですが、間違っていたらご指摘ください。
     (1)「Find」→「Find Handle or DLL」
     (2)「Process Explorer Search」のダイアログが出るので、検索欄に「tmmon.dll」と入力する
     (3)「Search」釦を押す
     (4)これで検索結果に表示されるのが、「tmmon.dll」を使用しているプロセス(.exe)の一覧だと思います。17個くらいのプロセスが表示されます。

    2.「tmmon.dll」の検索結果
     (1)エラーが発生する状態(ウィルスバスター起動時)は、自作アプリ(Win32Project1.exe)の名前が検索結果欄に表示されます。
     (2)エラーが発生しない状態(ウィルスバスター終了時)は、自作アプリ(Win32Project1.exe)の名前は検索結果欄に表示されません。
     これは、エラーが発生しない状態では「tmmon.dll」がロードされていないと理解しているのですが、間違っていたらご指摘ください。

    3.該当プロセスにトレンドマイクロ社以外の 3rd ベンダー製モジュールがロードされていないか
     「tmmon.dll」の検索結果に表示されるプロセスは17個くらいあります。この中には知っている名前もありますが、知らない名前の方が多いです。どれが「3rd ベンダー製モジュール」なのかわかりません。

    「ライブデバッグ」や「WERでプロセス クラッシュ時のダンプを採取」については、調べてみますので、時間をください。


    • 編集済み fghck856 2017年3月28日 19:28
    2017年3月28日 19:25
  • 「ライブデバッグ」、「WERでプロセス クラッシュ時のダンプを採取」について

    少しネットを検索してみましたが、「ライブデバッグ」というのはデバッグ専用ソフトで、メモリダンプをしたりすることのようです。
    「WER」というのは「Windows エラー報告」のことのようで、これは私のパソコンでは「有効」になっていました。ですがこれでどうして「クラッシュ時のダンプ」を採取するのかわかりません。
    いずれにしても、専門的なバイナリ回りの知識がないと無理のようです。
    具体的な手順をご教示いただければ話は別ですが、そうでなければ今の私がにわか勉強してできるというものではなさそうです。
    せっかくご教示いただいたものですが、勉強不足ですみません。

    2017年3月28日 23:08
  • 知らなかったら、知る努力をすればいいいだけなので、いちいち謝る必要はありません。

    ☆ Process Explorer について
    操作および確認方法は、概ね提示されている手順で問題ないのですが、私がこの確認を提案した背景を説明しておきます。
    個々のプロセス (アプリ, サービス, etc.) の仮想メモリ空間にロードされる DLL には、大きく分けて2種類あります。
    1つは個々の exe, dll ファイルの PE (Portable Executable) ヘッダー内で指定されている DLL 群で、もう1つはサービス等の外部プロセスから DLL Injection でロードされる DLL 群です。
    (先の返信で "クリーン ブート" での検証を提案したのは、後者 DLL Injection の影響を排除するためです。)
    "tmmon.dll" はトレンドマイクロ社が提供している DLL なので、自作アプリ(Win32Project1.exe)プロセス内にロードされたこの DLL は、トレンドマイクロ社製の何かのサービス プロセスによって DLL Injection されたと考えられます。
    で、DLL Injection されるモジュールは、インストールされているソフトウェアに依存して変化する可能性があります。
    つまり PC 環境ごとに DLL Injection されるモジュールは変化することがあるのです。
    異なる 3rd ベンダー製サービスが複数の DLL Injection を行っている場合、注入されたお互いの DLL が干渉し、潜在的なバグが表面化することも多々あるのです。
    あくまでも私見ですが、今回の問題も "tmmon.dll" 単体の原因ではなく、他の 3rd ベンダー製 DLL も関与しているのでは。。。というのが私の推測です。
    (Google 先生に質問しても、過去数カ月に "tmmon.dll" が原因で "0xC0000005" のクラッシュした事例は見当たらなかったので。)
    Process Explorer では、個々のプロセス内にロードされている DLL 一覧を確認することができるので、問題が起きるときと起きないときで、自作アプリ(Win32Project1.exe)プロセス内にロードされる DLL にどのような変化があるのか、きちんと精査されることをお勧めします。

    ☆ ライブ デバッグおよびダンプについて
    ライブ デバッグやダンプ解析は、確かにある程度の専門的な知識が必要になりますが、それを行うツール類に関しては「タダ」で手に入るので、誰でも挑戦できます。
    例えば、WER でアプリ クラッシュにプロセス ダンプを生成する設定を行い、それにより得られたダンプ ファイルをこちらから指示する方法で解析することも可能だと思います。
    そのダンプ解析ログを提示すれば、それを理解できる人が見れば、返信してくれるかもしれません。
    (私の知る限り、このフォーラムでもダンプ ログを見れる方が数名いらっしゃいます。)
    ダンプ解析に挑戦する根性があるのでしたら、お手伝いします。
    (ただしお役に立てるかどうかは、保証の限りではありません。)
    2017年3月29日 2:59
  • 詳細なご回答ありがとうございます。残念ながら今の私に回答の趣旨を100%理解する能力がありませんが、わかるところからだけでも1つずつやってみたいと思います。

    1.DLL Injectionについて
     かなり高度な話のようで、現状では良く理解できませんが、すこし勉強させてください。

    2.Process Explorerでは、個々のプロセス内にロードされている DLL 一覧を確認することができる
     やってみたいと思います。ただ今の時点では操作方法が全くわかりません。すこしProcess Explorerをいじってみたいと思います。

    3.ライブ デバッグおよびダンプ
     これもかなり高度な話のようですが、2項ができたら、こちらの方に進んでみたいと思います。

    2017年3月29日 7:28
  • ご回答ありがとうございます。昔はアンチウィルスソフトを入れるのが常識でしたが、今では時代が変わってきたのでしょうか。
    ウィルスバスターをアンインストールすることも含めて考えてみたいと思います。
    2017年3月29日 7:33
  • 1.DLL Injectionについて
    Win32 API など Windows システムが提供する様々なサービス関数 (インターフェイス) を Hook して、独自の機能を追加するためによく使われる手法です。
    例えば、user32.dll 内に実装されている MessageBoxA() / MessageBoxW() API を Hook して独自の Message Box を表示させたり、kernel32.dll 内の CreateFileA() / CreateFileW() API を Hook してアプリ側からの要求とは全く別のファイルを開いたり。。。とか色々できます。
    セキュリティ対策ソフトやマルウェアは基本的にこの手法を応用して、あんなことやこんなことをやっているはずです。

    2.Process Explorer について
    Process Explorer は、個々のプロセスの状態を確認することのできる、非常に優れたツールです。
    Process Explorer に限らず (このツールを提供している) SysInternals のツールは、みんなとっても便利ですので、これを機会に使ってみるといいかも。
    (みんなフリーウェアですが、個人的にはお金を払ってもいいくらい。)

    3.ライブ デバッグおよびダンプについて
    ホントは、この手の問題調査は、ライブ デバッグかダンプ解析が一番早く問題解決できます。
    (ただ、こういう直接顔を突き合わせない場で説明するのが、ちょっと大変なんですよね。。。)
    ダンプ解析に挑戦する気になったらお手伝いしますので、ご連絡ください。
    ただ、いつも見ている訳ではないので、気が付かなかったらごめんなさい。
    (昔は毎日見てたけど、最近はほとんど見てないので。)

    • 編集済み お馬鹿 2017年3月29日 9:00 誤記訂正
    2017年3月29日 8:59
  • 1.Process Explorerで自作アプリのプロセス内にロードされている DLL 一覧を確認する件について

    Process Explorerの左側に表示される、自作アプリの名前、Win32Project1.exeをクリックすると、Process Explorerのウィンドウの下半分に拡張子dllのファイルが多数表示されますが、操作方法はこれでよいのでしょうか。
    だとすれば、表示されるdllの数が非常に多いです。10個や20個ではなく、何十個とあります。その中に問題の「tmmon.dll」もありますが、こう数が多くては、エラーの発生する場合と発生しない場合のdllを比べるといっても容易ではありません。

    2.トレンドマイクロからの回答について(中間報告)
    本件について、トレンドマイクロにも問い合わせていましたが、最初の回答がありました。その中で、「スキャンオプションを変更してどうか」というものがあり、やってみたところ、エラーが発生しなくなりました。スキャンオプションの変更とは、「スキャンオプション3 (UM)」 のチェックを入れるというものです。これがどのような意味をもつのか、その状態で使って良いのかはまだわかりませんが、この結果をトレンドマイクロに連絡しまして、今その回答待ちです。

    2017年3月29日 10:53
  • ☆ Process Explorer の操作について
    "Process Explorer" ウィンドウの上段左側の Process Tree View で自作アプリ (Win32Project1.exe) をハイライト状態にし、メニュー バー "View" → "Lower Pane View" → "DLLs" を選択すれば、該当プロセスのユーザー モード側仮想メモリ空間にロードされている DLL の一覧が確認できます。
    この表示された DLL 一覧を "Company Name" でソートすれば、"Microsoft Corporation" とそれ以外を分類できます。

    ☆ トレンドマイクロからの回答について
    「スキャンオプションの変更」が Windows システムに対してどのような影響を与えるのか私にもわかりませんので何とも言えませんが、仮にそれで問題現象が改善されたとしても、なぜその設定の変更が特定の環境でのみ必要になるかが解せません。
    特定の環境でのみ「スキャンオプションの変更」が必要になるのであれば、その基準が何なのか、ちゃんと把握しておく必要があると思います。
    (「スキャンオプションの変更」が保護機能を低下させるものならば、本末転倒のような気もしますが。。。)

    2017年3月30日 4:16
  • 1.Process ExplorerでDLL 一覧を確認する件について
    操作方法のご教示ありがとうございます。しかしながら、私のProcess Explorerはウィンドウ上部、左から4つ目に「Process」がありますが、これを選択して出てくるプルダウンメニューの中に、「Tree」とか「View」とかが有りません。私がダウンロードしたProcess Explorerのバージョンは「v16.20」ですが、バージョンが違うのでしょうか。
    自作アプリ名、Win32Project1.exeをクリックすると反転表示になり、、ウィンドウ下半分にdllのリストが出ます。エラーが出る状態ではマイクロソフト以外のdllはトレンドマイクロの「tmmon.dll」と「TmUmEvt.dll」の2つだけです。エラーが出ない状態(ウィルスバスターを終了した状態)にしても、マイクロソフト以外のdllはこの2つで、同じです。

    2.トレンドマイクロからの回答について
    ご意見ありがとうございます。今またトレンドマイクロとやり取りしているところです。もう少し結論めいたものが出てからまた報告したいと思います。今しばらく、お待ち願います。

    2017年3月30日 10:29
  • ☆ Process Explorer の操作について
    先の私の返信で "Process Tree View" といったのは、"Process Explorer" ウィンドウの上段左側ペインにツリー状で表示されているプロセス一覧のことです。
    このプロセス一覧の中から、自作アプリ (Win32Project1.exe) をハイライト状態にしたあとに、メニュー バー "View" → "Lower Pane View" → "DLLs" を選択すれば、下段ペインにロードされている DLL 一覧が表示される。。。ということです。

    > マイクロソフト以外のdllはこの2つで、同じです。
    Trend Micro 社以外の以外のコンポーネントに差異が無いのであれば、私の推測は「外れ」ということになります。
    誤った情報をお伝えしてしまい、申しわけありませんでした。

    2017年3月31日 6:42
  • 1.Process Explorerの操作ついて
    補足説明ありがとうございます。それならば、私の操作方法で良いようですね。

    2.「Trend Micro 社以外のコンポーネントに差異が無いのであれば...」について
    失礼ですが、これは誤りで、正しくは「マイクロソフト以外のコンポーネントに差異がなければ」ではないですか?もし私がまちがっていたら、ごめんなさい。おっしゃる文面がもし正しいならば、トレンドマイクロ以外のコンポーネント(dll)はすべてマイクロソフトのdllです。
    このマイクロソフトのdllは何十個とあり、エラーが出る場合と出ない場合で差異があるかどうかを調べるのは困難です。

    2017年3月31日 7:15
  • トレンドマイクロからの回答について

    トレンドマイクロからの指示により、次のフォルダをウィルスバスターの「例外設定」にしたところ、30回やってもエラーは出ませんでした。
    1.Visual Studioのプログラム、devenv.exeが入っているフォルダ
    2.自作アプリ、Win32Project1.exeが入っているフォルダ
    「例外設定」とは、ウィルススキャンの対象から外すということです。トレンドマイクロはこれで使用し、様子をみてもらいたいとのことです。万一エラーが再発するようなら連絡することになりました。
    私としてもこれで良いと思います。万一エラーが出るようなら、皆様方にも報告したいと思います。
    本件について、多くの助言、ご回答いただきありがとうございました。ひとまずこれでこのスレは終わりにしたいかと思います。

    2017年3月31日 9:19
  • 説明が足りず申し訳ありません。
    問題が発生する場合も発生しない場合も、ロードされるマイクロソフト製のモジュールには基本的に差異が無いことを前提としています。
    仮にロードされるマイクロソフト製のモジュールに差異があるのであれば、それは外部プロセスからの DLL Injection の影響によるものと考えられます。
    私が着目しているのは、あくまでも Trend Micro などの 3rd ベンダー製モジュールなので、「Trend Micro 社以外のコンポーネントに差異が無いのであれば...」という書き方をしました。

    > 「このマイクロソフトのdllは何十個とあり、
    >   エラーが出る場合と出ない場合で差異があるかどうかを調べるのは困難です。」
    個人的には不可能ではないと考えます。
    というか、私は調査で行き詰ったときは、必ずこういった初歩的な部分を必ず調べます。
    要は、比較する手間が面倒ってことですよね?
    だったら、テキスト データに変換してその差分をチェックするとか、効率的に知らべる方法はいくらでもあると思います。
    面倒だったら、知恵を絞って楽に調べる方法を考えればいいだけです。
    「面倒だから困難」というのは、私にはあり得ない。。。
    2017年3月31日 9:24
  • >「面倒だったら、知恵を絞って楽に調べる方法を考えればいいだけです。「面倒だから困難」というのは、私にはあり得ない」

    頭が下がります。その精神は見習いたいと思います。

    2017年3月31日 9:40