VB6.0
VC++6.0
WindowsXP
VB6.0で作成したEXEを使って、VC++6.0で作成したdllをデバックしています。
exeは、デバックセッションの実行可能ファイルに設定しました。
また、exeとdllはdllのソースと同じフォルダに入れています。
dllを実行させると、exeは起動しますが、exeからdllを呼び出すと、
VC上のブレイクで止まりません。
どのように設定すれば止まるようになりますか。
教えてください。
>また、exeとdllはdllのソースと同じフォルダに入れています。
まず、DLLプロジェクトの「デバッグ構成」の「出力ディレクトリ」
(多分debug)に、VBのEXEをコピーして、それをデバッグセッション
の実行可能ファイルに登録しなおして、やり直してみてください。
仲澤@失業者様、回答ありがとうございます。
>まず、DLLプロジェクトの「デバッグ構成」の「出力ディレクトリ」
>(多分debug)に、VBのEXEをコピーして、
つまり、
[プロジェクトの設定]-[一般]タブ
出力ディレクトリ-出力ファイルのDebugとなっている箇所を
VBのEXEのパスに置き換えるという意味ですか?
その場合、ビルド時に「出力ディレクトリを作成できません」とエラーがでます。
>[プロジェクトの設定]-[一般]タブ
>出力ディレクトリ-出力ファイルのDebugとなっている箇所を
>VBのEXEのパスに置き換えるという意味ですか?
違います。何度書いても同じような内容になりますので、
理解してもらえるかどうか怪しくなってきましたが(vv;)、
VBで作った実行ファイル「?????.exe」をコピーして、
デバッグ対象としている「DLLのプロジェクト」の実行ファイル
が出力されるディレクトリの「中に」貼り付けてください。
その上で、「DLLプロジェクト」のデバッグセッションの実行
可能ファイルを、「今貼り付けた」「????.exe」に設定します。
仲澤@失業者様、回答ありがとうございます。
>VBで作った実行ファイル「?????.exe」をコピーして、
>デバッグ対象としている「DLLのプロジェクト」の実行ファイル
....
>可能ファイルを、「今貼り付けた」「????.exe」に設定します。
はい、その設定はもう行っています。
>>exeは、デバックセッションの実行可能ファイルに設定しました。
>>また、exeとdllはdllのソースと同じフォルダに入れています。
書き方が悪くて申し訳ありません。
他に何が足りないのでしょうか。
ご教授願います。
>>また、exeとdllはdllのソースと同じフォルダに入れています。
「ソースと同じフォルダ」ではなく、「debugフォルダ(DLLが作成されるフォルダ)」と言っているんですよ。
本当にそうなっていますか?
maruさん、回答ありがとうございます。
はい、同じです。
ソースと作成されるdllとexeは同じフォルダにあります。
> ソースと作成されるdllとexeは同じフォルダにあります。
デフォルトでは「ソースが置かれているフォルダ」と、「DLLが作成されるフォルダ」は別のはず。
プロジェクトフォルダ(ソースが有るフォルダ)が C\PROJECT ならDLLは C:\PROJECT\debug に作成されるはず。exeをこのC:\PROJECT\debugにいれたらってことをいっているんだけど。
出力フォルダを替えたってこと?
まあ、上記の対策をしてもうまくいかないのなら、ちょっと手間がかかるけど、呼び出される関数の頭に__debugbreak();を置くのも一つの手。これでデバッグ出来なければ、DLL側の関数は正しく呼び出せていないってこと。
maruさん、ありがとうございます。
>出力フォルダを替えたってこと?
はい、変えました。
>まあ、上記の対策をしてもうまくいかないのなら、ちょっと手間がかかるけど、呼び出される関数の頭に__debugbreak();を置くのも一つの手。これでデバッグ出来なければ、DLL側の関数は正しく呼び出せていないってこと。
上記に関して、詳しく教えてください。
__debugbreak()は、exeのVBのソース内でdllの関数を呼ぶ前におくってことですか。
それとも、dllの関数を
int A(int a);
とすると、ヘッダの宣言に
__debugbreak int A(int a);
と書くのか、
cpp内に、
__debugbreak int A(int a){
・・・
}
と書くのか、、
申し訳ありませんが、教えてください。
少しは調べる努力したら。検索すればすぐにでてくるよ。
int func() /* デバッグしたい関数 */
{
__debugbreak(); /* DebugBreak();でも可 */
.../* デバッグ対象のコード */
}
maruさん、お手数をおかけして申し訳ありませんでした。
DebugBreak();をdll内関数に入れてみました。
そして、exeを実行させると
「問題が発生したため、***.exeを終了します。ご不便をおかけして申し訳ありません。・・・」
とエラーメッセージが表示されます。
デバックボタンを押下すると、
「例外unknown software exception (0x80000003)・・・で発生しました」
と赤×エラーメッセージが表示され、OKボタンを押下すると
落ちました。
つまり、dllを正しく呼び出せていないと判断していいのでしょうか。
だ〜か〜ら〜 調べた?
MSDNより引用
「DebugBreak
現在のプロセスでブレークポイント例外を発生させます。その後、デバッガに信号を送り、何らかの処理を強制的に実行させることができます。プロセスがデバッグ中でないときは、標準例外ハンドラの検索ロジックが使われます。ほとんどの場合、未処理のブレークポイント命令のために呼び出し側プロセスは終了します。」
メッセージからするとDebugBreak()がちゃんと呼び出されている(DLLの関数を呼び出せている)みたいだけど。
VC起動中なら、制御がデバッガに移ってデバッグできるはず。
デバッグ出来ないとするとあなたのVCに環境に何らかの問題があるかもしれないね。これ以上はよくわからないなぁ。
まぁDebugBreak()でもデバッガに飛ばないとするとブレイクポイントを仕掛けても止まらないのはそんなに不思議でもないか。
デバックってなんぞ?
>「例外unknown software exception (0x80000003)・・・で発生しました」
は、別の問題っぽいですが、他に重要な点として
1.DLLの関数の修飾が
extern "C" __declspec(dllexport) void __cdecl foo(){}
の様にになっていること
2.*.def ファイルを作成していて、かつ
LIBRARY MyDLL
EXPORTS
foo @1
の様にになっていること
等も確認しましょう。
もし、上記の文面が全く意味不明な場合は、
そうとう困難な状況にあるかもしれません。
> extern "C" __declspec(dllexport) void __cdecl foo(){}
__cdeclではなく__stdcallでは?
MSKB: [VB5] Visual Basic 5.0 から呼び出し可能な DLL の作成例
http://support.microsoft.com/kb/410837/ja
でもすべて__stdcallですし。
> は、別の問題っぽいですが、他に重要な点として
いやいや、
>>「例外unknown software exception (0x80000003)・・・で発生しました」
はint 3割り込みが発生したことを示しますからDebugBreak()が正しく呼び出され、
> ほとんどの場合、未処理のブレークポイント命令のために呼び出し側プロセスは終了します。」
の状態になっていることを示します。したがって、関数名の問題はクリアしているものと推察されます。
問題はデバッガに制御が移らないことです。
int 3 例外ハンドラが正しく設定されていない?
わかりません さんに確認しますが、普通のVCアプリはデバッグ出来るんですよね。
ためしに
テスト用のexeをVCでつくってみて
exeからデバッグしてみてはどうかな?
直接の解決にはならんが、問題の洗い出しにはなると思う
>__cdeclではなく__stdcallでは?
おっと、VBからでしたね。YuOさんおっしゃる通りです。
引数が2こ以上あると動かなくなっちゃいますねぇ(vv;)。
> 引数が2こ以上あると動かなくなっちゃいますねぇ(vv;)。
確かスタックの巻き戻しが呼び出し元か呼び出し先かの違いがあるので、
引数が1つでもあったら動かないような気が...
皆様ご教授ありがとうございます。
書込みが遅くなってしまって申し訳ありません。
残念ながら、何が悪いのかわからないままです。
ファイルに変数の値等を書き込ませながら、デバックを行うことは
できますので、現在はそれでデバックを行っています。
また何か新しい情報が入りました際には、書き込ませていただきます。
ありがとうございました。
デバックってなんぞ?
~~
ツイート | ![]() |