• ベストアンサー

VC++のCOMのデバッグ方法について

VC++でつくられたCOMをデバッガを使ってデバッグしたいのですが どのようにすればいいのか、よい手段がわからず困っています。 いま担当しているプログラムの作りとしては、 2つの実行可能形式ファイル(AAA.exeとBBB.exe)があって、 AAA.exeは、 単独で動かした場合は自分のクラスをレジストリ登録/解除するプログラムで それ以外にもいくつかの関数(後述のfunCCC関数やログ出力関数)を実装しています。 BBB.exeは、CoCreateInstance関数を使用してAAA.exe内のクラスのオブジェクトを作成して その中で定義されている関数(funcCCC)にアクセスしています。 AAA.exeを実行してCOMがレジストリ登録されていることは レジストリエディタで確認できていて、 また、BBB.exe内でCoCreateInstance関数が成功していることも、 funcCCCが実行されて正常で結果が戻ってきていることもプログラムの実行結果からわかります。 この状態で BBB.exeからfuncCCCをコールしたときに AAA.exeのfuncCCCにステップインしてデバッグしたいのですが このようなことは、たとえばVisualStudio(2003)のデバッグ機能でできるのでしょうか。 デバッグしたい理由としては、AAA.exeの単体テストを行うためと、 あと、AAA.exe内のログ出力関数が AAA.exeを単独で起動したとき、つまり 自分のクラスをレジストリ登録するときは正常にログ出力されているのですが BBB.exeからfuncCCCを実行したときは、 funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので デバッガを使って内部でどういう状態になっているのかを確認したいのです。 ログが出力されないので MessageBox関数を埋め込んでトレースや変数の内容を確認しているのですが その結果ではAAA.exeを単独で実行したときと同じように ログ出力関数がコールされているように見えます。 また DebugBreak関数を使う方法というのを見かけたので funcCCC内でDebugBreak()を実装してみたのですが その場合は、DebugBreakのところでプログラム(BBB.exe)が終了してしまいます。 COMについて認識違いがあればご容赦下さい。 よろしくお願いいたします。

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

  • ベストアンサー
  • gentoo314
  • ベストアンサー率41% (15/36)
回答No.3

気になったので、VS2003にて、ATL-EXEタイプのCOMを作ってテストしたところうまくいきました。 AAA.exe が終了していることを確認。走っていればタスクマネージャで強制終了してください。 AAA.exe のfuncCCCにブレークポイントを張っておいて、デバッグ起動。タスクマネージャにて AAA.exe が走っていることを確認。 BBB.exe をデバッグ起動。BBB.exe から、funcCCC を呼び出すと、ブレークポイントで止まります。 AAA.exe をCOM経由で起動させずに、VS上から起動しておくのがポイントです。

hvorfor
質問者

お礼

回答ありがとうございました。 この方法を試してみて、 BBB.exeからfuncCCCへ進んでいけることを確認しました。 COM経由でない方法でデバッグすればよかったんですね。 期待していたとおりの動きで、本当にありがとうございました。 あと、自分でも投稿後にいろいろ試していたところ、 オプションのデバッグの設定でRPCデバッグのところにチェックを入れると この方法でもBBB.exeからfuncCCCへステップインできました。 補足ということで載せておきます。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

AAA.exeのプロジェクト(ソリューション)はあるのでしょうか? AAAプロジェクトのプロパティまたは設定で 実行開始ファイルに BBB.EXEを設定 funcCCCの冒頭にブレークポイントを設定 F5でデバッグ実行 BBB.EXEの操作でfunCCCが呼ばれた時点でIDEがアクティブになると思います AAA.EXEがデバッグビルドである前提ですが ・・・

hvorfor
質問者

補足

回答ありがとうございます。 AAA.exe、BBB.exeともにプロジェクトが存在していて 両方ともデバッグモードでビルドしています。 レジストリ登録するとき(AAA.exeを単独で起動するとき)も デバッグビルドの資産で行っています。 ご回答いただいている方法を試してみたのですが、 funcCCCのところで止まることはなく そのままプログラムが続行してしまいました。 funcCCC内の処理は正常に実行されているようです。 BBB.exe内のfuncCCCに入る直前にブレークポイントを張っても ステップインできずに処理が続いてしまいます。 通常のDLLのデバッグだと 回答していただいた方法でデバッグできることを確認しているのですが レジストリ登録されたものを呼び出す場合は この方法以外に何か配慮が必要なのかと思っています。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

>AAA.exeを単独で起動したとき、つまり >自分のクラスをレジストリ登録するときは正常にログ出力されているのですが >BBB.exeからfuncCCCを実行したときは、 >funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので ログファイルは、誰が、どのタイミングでオープン、クローズしていますか? 前者と後者では「実行しているプロセス」が異なるので、ログファイルのアクセス権やオープンクローズのタイミングを考えねばなりません。 「ログファイルへのアクセス権がAAA.exeにしか無い」なら、後者の場合にはログは出力出来ません。

hvorfor
質問者

お礼

回答ありがとうございます。 ログファイルのオープン/クローズは ログ出力関数内の出力する直前・直後で行っています。 ただ、オープン/クローズにエラー処理が入っていなくて 投稿後にエラーメッセージを取得する処理を入れて確認してみたところ ログファイルのパスの指定がおかしくなっていました・・・ 既存のプログラムに改修を入れているのですが 実行ドライブがCからDに変わったものの ファイルパスはドライブ指定を省略していたために 単独で起動したときはDドライブ配下のパスに、 COMから呼び出したときはCドライブ配下のパスになっていたようです。 投稿する前に確認が足りなくて申し訳なかったです。

関連するQ&A