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について認識違いがあればご容赦下さい。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
気になったので、VS2003にて、ATL-EXEタイプのCOMを作ってテストしたところうまくいきました。
AAA.exe が終了していることを確認。走っていればタスクマネージャで強制終了してください。
AAA.exe のfuncCCCにブレークポイントを張っておいて、デバッグ起動。タスクマネージャにて AAA.exe が走っていることを確認。
BBB.exe をデバッグ起動。BBB.exe から、funcCCC を呼び出すと、ブレークポイントで止まります。
AAA.exe をCOM経由で起動させずに、VS上から起動しておくのがポイントです。
回答ありがとうございました。
この方法を試してみて、
BBB.exeからfuncCCCへ進んでいけることを確認しました。
COM経由でない方法でデバッグすればよかったんですね。
期待していたとおりの動きで、本当にありがとうございました。
あと、自分でも投稿後にいろいろ試していたところ、
オプションのデバッグの設定でRPCデバッグのところにチェックを入れると
この方法でもBBB.exeからfuncCCCへステップインできました。
補足ということで載せておきます。
No.2
- 回答日時:
AAA.exeのプロジェクト(ソリューション)はあるのでしょうか?
AAAプロジェクトのプロパティまたは設定で
実行開始ファイルに BBB.EXEを設定
funcCCCの冒頭にブレークポイントを設定
F5でデバッグ実行
BBB.EXEの操作でfunCCCが呼ばれた時点でIDEがアクティブになると思います
AAA.EXEがデバッグビルドである前提ですが ・・・
この回答への補足
回答ありがとうございます。
AAA.exe、BBB.exeともにプロジェクトが存在していて
両方ともデバッグモードでビルドしています。
レジストリ登録するとき(AAA.exeを単独で起動するとき)も
デバッグビルドの資産で行っています。
ご回答いただいている方法を試してみたのですが、
funcCCCのところで止まることはなく
そのままプログラムが続行してしまいました。
funcCCC内の処理は正常に実行されているようです。
BBB.exe内のfuncCCCに入る直前にブレークポイントを張っても
ステップインできずに処理が続いてしまいます。
通常のDLLのデバッグだと
回答していただいた方法でデバッグできることを確認しているのですが
レジストリ登録されたものを呼び出す場合は
この方法以外に何か配慮が必要なのかと思っています。
No.1
- 回答日時:
>AAA.exeを単独で起動したとき、つまり
>自分のクラスをレジストリ登録するときは正常にログ出力されているのですが
>BBB.exeからfuncCCCを実行したときは、
>funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので
ログファイルは、誰が、どのタイミングでオープン、クローズしていますか?
前者と後者では「実行しているプロセス」が異なるので、ログファイルのアクセス権やオープンクローズのタイミングを考えねばなりません。
「ログファイルへのアクセス権がAAA.exeにしか無い」なら、後者の場合にはログは出力出来ません。
回答ありがとうございます。
ログファイルのオープン/クローズは
ログ出力関数内の出力する直前・直後で行っています。
ただ、オープン/クローズにエラー処理が入っていなくて
投稿後にエラーメッセージを取得する処理を入れて確認してみたところ
ログファイルのパスの指定がおかしくなっていました・・・
既存のプログラムに改修を入れているのですが
実行ドライブがCからDに変わったものの
ファイルパスはドライブ指定を省略していたために
単独で起動したときはDドライブ配下のパスに、
COMから呼び出したときはCドライブ配下のパスになっていたようです。
投稿する前に確認が足りなくて申し訳なかったです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(IT・Webサービス) エクセルの実行ファイルについての質問です。 1 2023/05/04 03:58
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- その他(セキュリティ) exeファイルの個人情報について 3 2023/06/29 17:36
- オープンソース Pythonのコードをexe化 1 2023/07/03 08:01
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「読み込み違反」が起きたとき...
-
Visual Studio 「AnyCpu」について
-
Windows PowerShellでC言語を実...
-
C++初心者です。 debug asserti...
-
JP1/File Transmission Server/...
-
JP1から起動したexeでhttpリク...
-
Eclipse CDT MinGWによるC言語
-
ActiveX → VB を起動するとCre...
-
VB6 EXEとプログラムの違い
-
VB6.0 exe作成時に実行時エラー...
-
C#VB、exeに埋め込んだexeの実行
-
VBコンソールアプリケーション...
-
(msvcr71d.dll) でハンドルされ...
-
外部exe呼び出しの方法 ShellEx...
-
実行ファイル(.exe)が別のPC...
-
system関数(Windows)の戻り値!!
-
Format 関数のバグ?
-
excel vbaから実行するexe実行...
-
Designer.vbは直接コードをいじ...
-
vba 時間の引き算 例えば 15:00...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Visual Studio 「AnyCpu」について
-
excel vbaから実行するexe実行...
-
「読み込み違反」が起きたとき...
-
Windows PowerShellでC言語を実...
-
C++初心者です。 debug asserti...
-
Pythonのコードをexe化
-
実行ファイル(.exe)が別のPC...
-
VB6.0 exe作成時に実行時エラー...
-
C#VB、exeに埋め込んだexeの実行
-
外部exe呼び出しの方法 ShellEx...
-
VisualStudioでC#が実行できない
-
ActiveX → VB を起動するとCre...
-
androidで.exeを実行できますか?
-
ActiveDirectoryから値を取得
-
Format 関数のバグ?
-
system関数(Windows)の戻り値!!
-
C言語に詳しい人に質問です。
-
VS2008 の C++ で作成したEXEの...
-
ACCESSランタイムでエラー
-
WindowsXpでAppActivate
おすすめ情報