外部dllやbmp、gif…とにかく外部ファイルが
突然読めなくなる症状に見舞われています。
具体的にどのような状況で…と言うにも、
いつも通り(ソース等をいじらずに)実行していただけなのです。
同じような症状に見舞われた方いらっしゃいませんでしょうか?
当方、VB6を使用しています。
追加情報です。
発生するのは、実行時エラー'53'
であるというのを書くのを忘れてました。
オレのところでは再現可能じゃなかった…
MSDNより:ファイルが見つかりません。 (Error 53)
単純にファイルが無いと思われるが…
もしかして、ウィルスソフトか何か使っててそうなってないか?
ファイルへのアクセス権限がなくなっているとか…
※非常に未確認。
その読めなくなるDLLはどこに置いてあるんですか?
とりあえず思いつくのは
・ドライブの障害やネットワークドライブのネットワーク接続切れ
・ドライブ文字の変更/無効化、フォルダ構成の変更
・アクセス権の変更
・CHKDSKなど、ボリューム全体を排他的にアクセスする処理が走っている
・ウイルス感染
・ウイルス対策ソフトの誤動作
とかですね。自作のVB6アプリケーション以外から問題のファイルはちゃんと見えるのでしょうか?
>皆様
どうもですー。
>もしかして、ウィルスソフトか何か使っててそうなってないか?
>ファイルへのアクセス権限がなくなっているとか…
ウィルスソフトはインストールしていないパソコンなんです。
アクセス権限は…アドミニストレーター?だと思います。
>その読めなくなるDLLはどこに置いてあるんですか?
実行ファイルと同じ場所です。ソースには相対パスで記述してあります。
>・ドライブの障害やネットワークドライブのネットワーク接続切れ
>・ドライブ文字の変更/無効化、フォルダ構成の変更
>・アクセス権の変更
>・CHKDSKなど、ボリューム全体を排他的にアクセスする処理が走っている
>・ウイルス感染
>・ウイルス対策ソフトの誤動作
ネットワーク接続は関係ないかと…。
ドライブ文字やフォルダ構成、アクセス権限などは全くいじっていないです。
排他的処理も走っていないですね。
ウイルス感染…あまり考えたくはないですが、多分無いかと。
>とかですね。自作のVB6アプリケーション以外から問題のファイルはちゃんと見えるのでしょうか?
はい、ちゃんと見えています。
上にも書きましたが、何もいじっていない状態で、突然読めなくなりました。
実はこれと同じ症状が、他のパソコンで実行しようとした時にも起きました。
しかも或るパソコンでは動き、或るパソコンではエラー53になってしまいます。
謎です…。
>実行ファイルと同じ場所です。ソースには相対パスで記述してあります。
まさかとは思いますが、カレントディレクトリを変更する処理が
動いていることはないですか?
たとえば、コモンダイアログのファイルやフォルダ指定画面を出しているとか・・
DLLの格納場所をPATH指定しても同じ現象でしょうか?
まきさん
>たとえば、コモンダイアログのファイルやフォルダ指定画面を出しているとか・・
フォルダ指定画面は出していませんねー。
>DLLの格納場所をPATH指定しても同じ現象でしょうか?
やってみます!!
>>その読めなくなるDLLはどこに置いてあるんですか?
>実行ファイルと同じ場所です。ソースには相対パスで記述してあります。
たぶんそうだと思いました。
先ずDLLのパスを取って、ファイル名は
filename = App.Path & "\" & filename
とすればエラーは出なくなるのでは。
ねろさん
>filename = App.Path & "\" & filename
として、bmpは読めました!!
しかし、dllの場合、標準モジュールで読み込みをしているので、
そこにApp.Pathを記述することができません。
何か上手な記述方法はないでしょうか?
引数として渡せばええんちゃいまっか?
引数として渡す…例えば、
Public Declare Sub someFunc Lib "something.dll" ()
だったら、
Public Declare Sub someFunc Lib "App.Path & "\" & something.dll" ()
といった感じでしょうか??
…んーエラー出ますね。
初歩的な質問かもしれませんが、VBは実行すると、
まず標準モジュールを読みにいくのでしょうか?
それとも、フォームのLoadを先に読むのでしょうか?
もし標準モジュールを先に読むなら、
文字列変数を定義して、パスを代入してという操作ができませんよね??
> Public Declare Sub someFunc Lib "App.Path & "\" & something.dll" ()
> といった感じでしょうか??
> …んーエラー出ますね。
「んー」じゃないっすよ、なんてことするんですか!(笑)
"引数" で渡すように言ってるじゃないですか。
Public Declare Sub someFunc Lib "something.dll" (ByVal nFilePath As String)
こゆことですよ・・・。
もちろん、something.dll側のsomeFunc()メソッドも直す必要があります。
相対パスで実行するなら、ファイルの読み込み処理の直前に、
ChDriveステートメントとChDirステートメントを使って、
カレントディレクトリを変更しておけば動くような気がします。
といっても、UNCパスで実行されている場合は、ChDriveが使えないので、
APIなどに頼る事になりますし、やはり相対パスは処理が曖昧になりますので、
やはり、絶対パスに変換された方が無難だとは思いますけれども。
>先ずDLLのパスを取って、
あれ?読み間違いかな。
DLLが読むファイルではなくて、DLLそのものが読めないんですよね。
アプリがDLLを探す順番は、およそ
1、アプリケーションの起動ディレクトリ
2、カレントディレクトリ
3、Windows のsystemディレクトリ
4、Windows ディレクトリ
5、環境変数 PATH に記述されているディレクトリ
なんで、余計なもの(パス)を付けずに
Public Declare Sub someFunc Lib "something.dll" ()
だけでいいんでは。
>java.lang.Nullpoさん、魔界の仮面弁士さん、ねろさん
>Public Declare Sub someFunc Lib "something.dll" (ByVal nFilePath As String)
>もちろん、something.dll側のsomeFunc()メソッドも直す必要があります。
んー(笑)、dllのほうはいじりたくないんですよねー。
引数で渡すという方法、ちょっと複雑な感じですよね。
>なんで、余計なもの(パス)を付けずに
>Public Declare Sub someFunc Lib "something.dll" ()
>だけでいいんでは。
それだけだと、読めない状況になってしまったんです。
ちなみにbmpのほうは、
picSpace.Picture = LoadPicture(App.Path & "\" & "start.bmp")
と、App.Pathを用いて読み込めました。
問題は、やはりApp.Pathを用いてdllを読めるかどうか?というトコです。
> 実行ファイルと同じ場所です。
> Public Declare Sub someFunc Lib "something.dll" ()
フツー読めると思うんだけどなぁ・・・ orz
しかも前までは読めていたのだから不思議・・・
>フツー読めると思うんだけどなぁ・・・ orz
>しかも前までは読めていたのだから不思議・・・
同感です(;o;)
でも実際読めていたbmpも突然読めなくなって
App.Pathで回復したので、dllのほうもどーにかしたいですね。
>1、アプリケーションの起動ディレクトリ
>2、カレントディレクトリ
>3、Windows のsystemディレクトリ
>4、Windows ディレクトリ
>5、環境変数 PATH に記述されているディレクトリ
アプリの処理の途中でなんらかの原因でカレントディレクトリが変わってしまって
いると思いますが、上記5.は試行されましたか?
3,4、は対象外みたいですから、5、で解決するなら、1,2が変わったと
うことになると思いますが・・
エラー時にカレントディレクトリを表示してみてはいかがでしょう?
まきさん
>5、環境変数 PATH に記述されているディレクトリ
申し訳ないのですが、これはどうやって設定するのでしょうか??
>フツー読めると思うんだけどなぁ・・・ orz
>しかも前までは読めていたのだから不思議・・・
同感です、何か勘違いがあるのでしょう。
もう一度目を凝らして良く見て下さい。
DLLの名前が違うなどと言う事は絶対無いですよね!!
どうしてもダメな場合は、EXEと同じ所にあるDLLをWindowsの
Systemの中に移動してみましょう。
それとApp.Pathですが標準モジュールの中なので使用できないのではなく、
使用している場所がプロシジャーの外なので使用できないのです。
しかもDeclareの宣言の中で文字列の結合なんて出来ないでしょう。
書いているうちに他のレスがつきましたが、
しかしカレントディレクトリは変わりますが、起動ディレクトリは
変わらないと思うんですが。。。。
SYSTEM32に移動してみて試したらどうでしょう。
それでもダメなら、DLLが破壊されてる?
解決しました!!
結局DLLはSYSTEM32に移動して解決でした。
皆様、長々とありがとうございました!!
…次は、実行ファイルと同じ場所にDLLを置く(簡単な)方法を考えます。
マルチポスト先には、なぁ〜んの連絡も無しですか。
貴方のような人が居るから、マルチポストは嫌われるのです。
>さて
まぁ落ち着け。
>実行ファイルと同じ場所にDLLを置く(簡単な)方法を考えます。
App.Pathで実現できないのか??
SYSTEM32 に移動したら動いたってことは、
同名のファイルが、優先順位が高いディレクトリに存在していた?
あ、でも起動ディレクトリが最優先だよなぁ・・・ うー、ワカラン(w
<Warning>
マルチポストした場合は、ちゃんとフィードバックしておいてください。
でないと、解決してるのにも関わらず回答者にムダな労力を使わせることになります。
これは、大変失礼な行為です。
回答者は、あなたの都合の良い家庭教師でもなければ、検索エンジンでもないのです。
</Warning>
質問者様と同じ様な症状で悩んでいます。
開発環境はVB6 SP6 でWindowsXP Proです
私の場合はCommonDialog2.ShowOpenでプログラムを置かた場所以外のファイルを開き、もう一度プログラムを再起動させると
「実行時エラー'53' myfunc.DLLが見つかりません」
となります。
原因を考えるうちに、カレントディレクトリが変更されているみたいなのでとりあえず、
Private Sub Form_Load()
ChDrive App.Path
ChDir App.Path
・・・以下略・・・
End Sub
でもダメでした。
自作DLLなため、あまりSystem32に入れたくありません。
何か良い解決手段をお願い致します。
※回答ではありません。
というより回答は出来ないかも;
> 山兼さん
人のスレに便乗はやらないでください。
収集が付かなくなってしまう恐れがあります。
また、既に回答済みのスレですので見ない人もいるかもしれません。
なので、ここは一旦終了と宣言して、新たにスレを作ってみてください。
では。
ツイート | ![]() |