CommonDialogの後にDLLを呼び出すには?

解決


ポルテ  2006-11-11 01:53:16  No: 134078

VB6.0 + XPで製造しています。

CommonDialogとVC++で作ったDLLについての質問なのですが、
VC++で作ったDLLを使用することはできているのですが、
CommonDialogでファイル選択ダイアログを表示した後に
DLLをCALLするとDLLが呼び出せなくなります。
On Error GoToでエラー番号からメッセージを取得すると
「ファイルが見つかりません」という内容になります。

・DLL自体はEXEと同じ階層に置き相対パスで見ています。
・DLLのパスをフルパスで指定していた場合にはこのエラーは起きません。
・ファイルメニューからEXEを作成して、EXEを直接起動した場合は、
  相対パスでもエラーは起きません。

どなたか分かる方がいましたら教えてください。
よろしくお願いします。


Blue  2006-11-11 02:08:41  No: 134079

おそらく、CommonDialogのせいで「カレントディレクトリが移動」してしまっているため、
DelcareのDLLの指定の仕方によって参照できなくなってしまうのでしょう。

>・ファイルメニューからEXEを作成して、EXEを直接起動した場合は、
>  相対パスでもエラーは起きません。
ってことは、上の2つはデバッグモードで動かしているのでしょうか?


Blue  2006-11-11 02:17:23  No: 134080

ちなみに、DelcareでDLLを探しにいくディレクトリは
おそらくLoadLibrary関数と同じで、
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200609/06090062.txt
のスレの2006/09/26(火) 17:49:40 のレスの順番になると思われます。

デバッグ実行の場合、
>1.アプリケーションのロード元ディレクトリ
の扱いがよくわかりませんが、ここが App.Path でないということなんでしょうかね。
(CommonDialogを使う前まで動くのは 2.カレントディレクトリが App.Path だからかな)


ポルテ  2006-11-13 19:08:07  No: 134081

Blueさん返信ありがとうございます。
とても早く返信をくださったのに、
遅くなりすいません。

カレントディレクトリをCurDirで調べてみたら
たしかにカレントディレクトリが変わっていました。

ChDirを使用して変更したら動くようになったのですが、
DLLの呼び出しで正常に動く関数と
DLLの呼び出しでOn Error GoToでエラーに飛び
「ファイルが見つかりません」と表示される関数がでました。
しかし、「ファイルが見つかりません」となっているにもかかわらず、
DLL内の処理がしっかり実行されています。

「ファイルが見つかりません」というエラーは、
ファイルが見つからない場合以外でも表示されるものなのでしょうか?
エラーメッセージはエラー番号からErrorで取得しています。

>>・ファイルメニューからEXEを作成して、EXEを直接起動した場合は、
>>  相対パスでもエラーは起きません。
>ってことは、上の2つはデバッグモードで動かしているのでしょうか?
というのは、
・DLL自体はEXEと同じ階層に置き相対パスで見ています。
・DLLのパスをフルパスで指定していた場合にはこのエラーは起きません。
の2つでしょうか?
この2つは、デバッグモードで実行しています。

わかる方がいましたらよろしくお願いします。


Blue  2006-11-13 19:26:16  No: 134082

>しかし、「ファイルが見つかりません」となっているにもかかわらず、
>DLL内の処理がしっかり実行されています。
は本当でしょうか?
どんな処理をしてこのメッセージが出るのでしょうか?

>この2つは、デバッグモードで実行しています。
ということは、最終的に出来上がるものは EXE になるので、
EXEで動かしたときに問題なければいいようですけど。
(テストはEXEでやりますよね?)

デバッグ実行時だけ、対象となるDLLを
>6.環境変数 PATH に記述されている各ディレクトリ
のように PATH を設定して動かしたほうがいい気がします。
で、最終的なEXEのテスト時にその設定したPATHを消す。
(デバッグ実行で動くようにするためだけにChDirを入れるのはよくないと思う)


ポルテ  2006-11-14 19:09:59  No: 134083

Blueさん、ありがとうございます。

>>しかし、「ファイルが見つかりません」となっているにもかかわらず、
>>DLL内の処理がしっかり実行されています。
>どんな処理をしてこのメッセージが出るのでしょうか?
ファイルへ情報を書き出す処理をDLL内で行うのですが、
この行へステップインで進んでいき
ファイルへ書き出す関数へ来た時にOn Error GoToで
エラー処理に飛びError()で「ファイルが見つかりません」
という文字列が設定されています。
このとき、ファイルは書き出されているので
この関数は実行されていると考えています。

>PATH を設定して動かしたほうがいい気がします。
ChDirを使わずに、PATHを設定したら正常に
動作するようになりました。

「ファイルが見つかりません」がはっきりせず少しもやもやしますが、
とりあえず正常には動作するようになったので、
解決にしておきます。

Blueさん、本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加