- ベストアンサー
VC++で作成したDLLのデバッグ
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
お書きになった内容だけでは現象がよくわかりませんが、そのようなケースでEXEファイルに何か書き込まれることはありません。 >VC++のDLLファイルのデバッグモードはVBのEXEファイルでは利用できないのでしょうか? そんなことはないはずです。 どこで例外エラーが出ているのか調べましたか? おそらくDLLの内部で例外が出ているのだと思いますから、段階を追って調べた方がいいと思います。 DLLが正しくロードされているか確認しましたか?あるいは、EXEで呼び出しているそのDLLのエクスポート関数のプロトタイプが違うということはありませんか?同じ名前のDLLでバージョンが異なるものが他のフォルダに存在するというようなことはありませんか? DLLのプロジェクトの「デバッグセッションの実行可能ファイル」にそのVBで作ったEXEファイルを指定してデバッグをしたのですよね?念のためDLLと同じ場所にEXEファイルを置いておくほうがいいかもしれません。 (同じ名前のDLLがシステムフォルダ等にあるとそちらが優先的にロードされてしまう可能性がある)
その他の回答 (3)
- tomokopg
- ベストアンサー率33% (7/21)
mnabeさんもおっしゃってますけれども、「マルチスレッドのプログラムにブレークポイントはってテスト」というところにまず無理があると思います。 ログをはくなどして、スレッドの制御があなたの想定通り行われているかどうかチェックする必要があるでしょう。その結果をデバッグビルドとリリースビルドと照らし合わせてみたらいかがですか。
お礼
ご回答してくださった皆様。ありがとうございました。 何が原因だったかはいまだ不明なのですが、 マルチスレッドでブレークポイントをはると 私の意図していない処理がおきるようです。 本件とは関係ないですが、デバッグとリリースでは使用する ランタイムライブラリが異なるため、それにより発生するエラーもあるそうです。
- mnabe
- ベストアンサー率33% (427/1283)
っで呼出の方法は? その呼び出した時のオブジェクトの生きている最中に、DLLは終了できているのですか? 話を聞いていると、マルチスレッドの様ですので、その場合には、オブジェクトの生きている最中に終わらない事がよくあります。特に、デバッグ環境では、スレッドの制御が少しでもミスっていると、よく意味不明なエラーが発生します。 特に、ブレークポイントを張っていると顕著にでます。 そういう時には、動作LOGを生成する等の方法でデバッグするとよいでしょう。
お礼
ご回答ありがとうございます。あれから重ねてテストをしてみました。 呼び出しはVB側でDeclare宣言をして呼び出しています。 ブレークポイントでどれかスレッドをとめた場合、他のスレッドは どういう状態なのでしょうか? 基本的にとまっているようなのですが、 あるスレッドはWaitForMultipleObjectsでCreateEventで つくったイベントがシグナル状態になるまで待機 しているのですが、そのイベントがシグナル状態になった瞬間に アセンブラモードの中であるメモリアドレスを参照しようとし例外エラー でとまってしまいます。 よってハンドルやスレッドは解放されず、正常終了できません。 DLL自体のソースは全て自分で書いたわけではなく、もともとあったものを 私が修正追加を行いまして3つスレッドが同時に動いている感じです。 いろいろなポイントでエラーログを作っていくのは効果的かと思いますが ステップ数が10000ほどあり、なかなか効率的にはいかないのが現状です。 しかし何故かリリース版のDLLを使うと問題なく動作するという具合です。 そのDLLは特に特殊なライブラリなどは使用せず、MFCもつかっていません。 VCのデバッグモードで正常に実行できない、リリース版だと実行できることから VBのEXEファイルではデバッグモードで実行できないのではと勘違いしてしまいました。
- mnabe
- ベストアンサー率33% (427/1283)
貴方の提示して条件では、以下の答えになります。 『利用出来ます。』 次の情報が最低は必要です。 VBのバージョンは(多分6.0でしょう) 例外エラーとはどんなエラーなの? エラーメッセージをなるべく正確 例外エラーは、DLLの呼出前なの後なの? 開発環境のOSは? DLL のリリースでも同様の現象なの? VBのプログラム以外からは? エラーの後、どうなりますか? VCが終了してしまう(要するに、DLLのエラーではなく、VCがエラーを掃出している) DLL の実行が出来ないだけ DLL のステップ実行ではどうなります? DLL ってどんな作り?? VBから呼べる様に作ったの? それとも、COM なの? それとも、ActiveX.DLL なの? VBからはどんな呼出方法なの? DLLの宣言部分は大丈夫? 位の情報は提示して欲しいですし、確認を行って欲しいですね。まぁこれだけ全部確認とれば、大抵原因にたどり着くのですがね。
補足
正確にはVisual Basic6.0SP3 とVisual C++6.0SP3 OSはWindows2000 SP3です。 音声関係のプログラムでして詳しいことは申し上げられないのですが DLLファイルはマルチスレッドで動いています。 >VBのプログラム以外からは? これはたしかめいません。DLLが音声データを必要するため > DLL のステップ実行ではどうなります? アセンブラモードの中でとまります。 > DLL ってどんな作り?? VBからは呼べます。実際リリース版では正常に動作します。 _stdcallとdef定義で作成しています。 >VBからはどんな呼出方法なの? 必要なパラメータは音声データのポインタと、その他音声データのパラメータです。 >DLLの宣言部分は大丈夫? デバッグモード以外は正確に動くので大丈夫かとおもいます。
関連するQ&A
- VC++2005で、リリースモードとデバッグモードの2通りをコマンドラインで行いたい。
VC++2005で、リリースモードとデバッグモードの2通りでコンパイルしたいのですが、GUIでなく、コマンドラインでコンパイルしたいです。 オプションで、リリースモードの時のオプションとデバッグモードの時のオプションが知りたいです。 あと作成した、DLLやEXEからこれはデバックモード、リリースモードとわかる方法が知りたいです。 32/64bitの判定は、 dumpbinコマンドで分かりました。
- 締切済み
- C・C++・C#
- VCで作成したDLLの使用
VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000
- ベストアンサー
- Visual Basic
- VC++で作成したDLLについて
すみません、 VC++6.0で作成したDLLについて教えていただきたいのですが。 TEST_A.DLLというDLLと、TEST_B.DLLというDLLファイルを作成したとして これをC:\TEST\DLL\に格納してるとします。 このとき、TEST_B.DLLからはTEST_A.DLLの関数を呼び出しています。 次に、TEST_B.DLLの関数を使用しているTEST.EXEという実行ファイルを VB6.0で作成します。 このファイルをC:\TEST\EXE\に格納します。 そして、TEST.EXEを実行すると、 「TEST_B.EDLLが見付かりません」と言って怒られてしまいます。 VBでは、TEST_B.DLLをフルパスで指定しております。 しかし、TEST_A.DLLをEXEと同じ場所に置いてあげると 正常に動きます。 これは、TEST_B.DLLからTEST_A.DLLが見えていないということなのでしょうか? TEST_B.DLLの設定がおかしいのでしょうか? それとも、TEST.EXEでもTEST_A.DLLをフルパス指定してあげないといけないのでしょうか? ちなみに今回、プロジェクトマネージャーから「環境変数(PATH)の設定はしたくない」と言われていますので、PATHの指定はしてません。 すみませんが、どなたか教えていただけますでしょうか?
- ベストアンサー
- C・C++・C#
- BCBで作成したDLLを、VC++で静的リンクさせる方法
BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成 「VC++スタイルのDLL」で作成、 「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成 (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成 (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に 作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?
- ベストアンサー
- C・C++・C#
- VS2008でVBとC++を一つのプロジェクトにすることができますか?
VB6.0からの移行組です。現在VB6.0をメインにしてVC++6.0で作ったdllをVBで呼んでいます。VBでデバッグ中にC++で作ったdll内にバグがあった場合にどこにバグがあるかわからず不便です。 VS2008ではVBとVC++を一つのプロジェクトにまとめる事ができますか? そうすればデバッグ中にVBとVC++のコードを一連の流れで動かしてやれば、どこがおかしいのか分かりやすくて便利なんですが。 (C++がコンパイル型だから無理かな・・・) 素人な質問ですみませんがよろしくお願いします。
- ベストアンサー
- Visual Basic
- C#からVC++DLLの呼び出しに失敗する
VS.NET2005のC#からVC++6.0で作成したDLLを呼び出しています。 VCのデバッガでデバッグしてみると呼び出した関数は正常に動作しているようなのですが、最後のreturnを実行しC#に戻るところでエラーが出てしまいます。 C#側では「'System.ExecutionEngineException' のハンドルされていない例外が ConsoleApplication1.exe で発生しました。」となります。 C#での宣言は、 [DllImport("test.dll")] public static extern uint TestFunc(ref byte[] moji, ref uint nagasa); です。 VC++の宣言は、 __declspec(dllexport) unsigned long __stdcall TestFunc(unsigned char* moji, unsigned long* nagasa) です。 C#へ値を返さない関数は問題ないのですが、値を返そうとすると起きるようです。不備などあればご指摘いただけないでしょうか。 ちなみにVB6からは問題なく動作できました。
- ベストアンサー
- C・C++・C#
- VBがデバッグ時落ちてしまう
VC6.0でDLLを作成し、VB6.0で呼び出すプログラムを作成しています。 DLLの内容はWindowハンドルを引数にしてそのハンドルを持つWindow上にListboxを作成するというようなものです。(もともとC言語用のDLLだったものをVBで使いまわしています) このプログラムをデバッグ実行し、デバッガ上で停止[実行->終了]とすると、VB6.exeがアプリケーションエラーで落ちてしまいます。(DLLの関数を呼ばない限り大丈夫です) デバッグ実行でも普通に終了(アプリケーションでの終了)であれば正常に終了してくれます。 このままですと、実行時エラーで止まる度にVB6.exeが落ちてしまい非常に不便です。 このような現象で困った方いませんか? 解決策がありましたら教えてください。
- ベストアンサー
- Visual Basic
- 「MFC40D.DLLがみつかりません」とでてしまいます
VC++ Standard Edition 4.0を使ってデバッグモードでコンパイルしたプログラムを友人に渡し、起動すると 「プログラム開始エラー 必要なDLLファイルMFC40D.DLLが見つかりませんでした。」 とでて起動できませんでした。 私のコンピューターにあるMFC40D.DLLも渡してc:\wndows\system\にいれてもらっても同じメッセージが出るそうです。 どのようにしたら友人のパソコンでも実行できるようになるでしょうか?
- 締切済み
- C・C++・C#
- VBで使用できるDLL(SSL通信)をVC++で作成する。
VBで使用できるDLLをVC++で作成しました。 内容は、SSL転送をWindowsで行うためのDLLです。 DLLではなくexeで作成したときはDOS窓からうまく動いたのですが、 DLLで作成をして、VBから呼んだときにエラーメッセージがでてプログラムは実行されません。 エラーメッセージは、 実行時エラー'53': ファイルが見つかりません:dll-file-name です。 エラーにはいろいろな要素があると思うのですが、 このエラーが出るか出ないかは、関数の中のSSL通信のプログラムを書くと このエラーがでます。 例>SSLeay_add_ssl_algorithms(); SSL通信の記述がなければ正常に実行されるので、この部分だけだと思うの ですが、特別な設定、記述があれば教えてください。 よろしくお願いします。
- ベストアンサー
- ネットワーク
- VCやVBで作成したDLLがどのEXEから起動されているか知りたい。
VBやVCで作成したDLLがそれぞれあります。 それぞれは複数のEXEから起動されます。 DLLの中でどのEXEから起動されたか知りたいんですが なにか方法はありませんか? 起動している関数などにパラメータを追加できない事情がありまして・・・ よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます。 もちろんブレークポイントをはりまくってテストを行いました。 例外エラーがでるポイントですが、 ブレークポイントをおってしらべていっていますが、 一定の場所ではありません。基本的にはポインタでありえない メモリアドレスを参照しようとしているのです。 WaitForMultipleObjectsでとめているスレッドがあるのですが そこでwaitがとけた後にエラーがおきる確立が40%ほどです。 しかしなぜかリリースでコンパイルしたDLLファイルだと正しく動作するのです。 コンパイルの際にEXEファイルの場所にコピーする設定になっています。 またSystemフォルダにはおいていません。 でそのときにEXEファイルをVB側で再コンパイルしないとエラーがおきるのです。 とりあえずVBのEXEでも問題ないことですので もうちょっと調べてみたいと思います。