外部ファイルが突然読めなくなる症状。

解決


プリン体  2004-12-07 11:19:51  No: 87165

外部dllやbmp、gif…とにかく外部ファイルが
突然読めなくなる症状に見舞われています。

具体的にどのような状況で…と言うにも、
いつも通り(ソース等をいじらずに)実行していただけなのです。

同じような症状に見舞われた方いらっしゃいませんでしょうか?

当方、VB6を使用しています。


プリン体  2004-12-07 13:31:26  No: 87166

追加情報です。
発生するのは、実行時エラー'53'
であるというのを書くのを忘れてました。


ガッ  2004-12-07 16:40:12  No: 87167

オレのところでは再現可能じゃなかった…

MSDNより:ファイルが見つかりません。 (Error 53)
単純にファイルが無いと思われるが…
もしかして、ウィルスソフトか何か使っててそうなってないか?
ファイルへのアクセス権限がなくなっているとか…
※非常に未確認。


ねろ  2004-12-07 17:14:50  No: 87168

その読めなくなるDLLはどこに置いてあるんですか?


ひろ  2004-12-07 19:02:28  No: 87169

とりあえず思いつくのは

・ドライブの障害やネットワークドライブのネットワーク接続切れ
・ドライブ文字の変更/無効化、フォルダ構成の変更
・アクセス権の変更
・CHKDSKなど、ボリューム全体を排他的にアクセスする処理が走っている
・ウイルス感染
・ウイルス対策ソフトの誤動作

とかですね。自作のVB6アプリケーション以外から問題のファイルはちゃんと見えるのでしょうか?


プリン体  2004-12-07 22:10:03  No: 87170

>皆様
どうもですー。

>もしかして、ウィルスソフトか何か使っててそうなってないか?
>ファイルへのアクセス権限がなくなっているとか…
ウィルスソフトはインストールしていないパソコンなんです。
アクセス権限は…アドミニストレーター?だと思います。

>その読めなくなるDLLはどこに置いてあるんですか?
実行ファイルと同じ場所です。ソースには相対パスで記述してあります。

>・ドライブの障害やネットワークドライブのネットワーク接続切れ
>・ドライブ文字の変更/無効化、フォルダ構成の変更
>・アクセス権の変更
>・CHKDSKなど、ボリューム全体を排他的にアクセスする処理が走っている
>・ウイルス感染
>・ウイルス対策ソフトの誤動作

ネットワーク接続は関係ないかと…。
ドライブ文字やフォルダ構成、アクセス権限などは全くいじっていないです。
排他的処理も走っていないですね。
ウイルス感染…あまり考えたくはないですが、多分無いかと。

>とかですね。自作のVB6アプリケーション以外から問題のファイルはちゃんと見えるのでしょうか?

はい、ちゃんと見えています。

上にも書きましたが、何もいじっていない状態で、突然読めなくなりました。
実はこれと同じ症状が、他のパソコンで実行しようとした時にも起きました。
しかも或るパソコンでは動き、或るパソコンではエラー53になってしまいます。
謎です…。


まき  2004-12-07 22:47:13  No: 87171

>実行ファイルと同じ場所です。ソースには相対パスで記述してあります。
まさかとは思いますが、カレントディレクトリを変更する処理が
動いていることはないですか?

たとえば、コモンダイアログのファイルやフォルダ指定画面を出しているとか・・

DLLの格納場所をPATH指定しても同じ現象でしょうか?


プリン体  2004-12-08 00:11:34  No: 87172

まきさん

>たとえば、コモンダイアログのファイルやフォルダ指定画面を出しているとか・・
フォルダ指定画面は出していませんねー。

>DLLの格納場所をPATH指定しても同じ現象でしょうか?
やってみます!!


ねろ  2004-12-08 00:26:42  No: 87173

>>その読めなくなるDLLはどこに置いてあるんですか?
>実行ファイルと同じ場所です。ソースには相対パスで記述してあります。
たぶんそうだと思いました。
先ずDLLのパスを取って、ファイル名は
filename = App.Path & "\" & filename
とすればエラーは出なくなるのでは。


プリン体  2004-12-08 01:31:19  No: 87174

ねろさん

>filename = App.Path & "\" & filename
として、bmpは読めました!!

しかし、dllの場合、標準モジュールで読み込みをしているので、
そこにApp.Pathを記述することができません。

何か上手な記述方法はないでしょうか?


java.lang.Nullpo  2004-12-08 01:48:21  No: 87175

引数として渡せばええんちゃいまっか?


プリン体  2004-12-08 01:56:12  No: 87176

引数として渡す…例えば、
Public Declare Sub someFunc Lib "something.dll" ()
だったら、

Public Declare Sub someFunc Lib "App.Path & "\" & something.dll" ()
といった感じでしょうか??

…んーエラー出ますね。

初歩的な質問かもしれませんが、VBは実行すると、
まず標準モジュールを読みにいくのでしょうか?
それとも、フォームのLoadを先に読むのでしょうか?

もし標準モジュールを先に読むなら、
文字列変数を定義して、パスを代入してという操作ができませんよね??


java.lang.Nullpo  2004-12-08 01:59:10  No: 87177

> Public Declare Sub someFunc Lib "App.Path & "\" & something.dll" ()
> といった感じでしょうか??
> …んーエラー出ますね。

「んー」じゃないっすよ、なんてことするんですか!(笑)
"引数" で渡すように言ってるじゃないですか。

Public Declare Sub someFunc Lib "something.dll" (ByVal nFilePath As String)

こゆことですよ・・・。

もちろん、something.dll側のsomeFunc()メソッドも直す必要があります。


魔界の仮面弁士  2004-12-08 03:55:46  No: 87178

相対パスで実行するなら、ファイルの読み込み処理の直前に、
ChDriveステートメントとChDirステートメントを使って、
カレントディレクトリを変更しておけば動くような気がします。

といっても、UNCパスで実行されている場合は、ChDriveが使えないので、
APIなどに頼る事になりますし、やはり相対パスは処理が曖昧になりますので、
やはり、絶対パスに変換された方が無難だとは思いますけれども。


ねろ  2004-12-08 04:48:55  No: 87179

>先ずDLLのパスを取って、
あれ?読み間違いかな。
DLLが読むファイルではなくて、DLLそのものが読めないんですよね。
アプリがDLLを探す順番は、およそ
1、アプリケーションの起動ディレクトリ
2、カレントディレクトリ 
3、Windows のsystemディレクトリ 
4、Windows ディレクトリ 
5、環境変数 PATH に記述されているディレクトリ 
なんで、余計なもの(パス)を付けずに
Public Declare Sub someFunc Lib "something.dll" ()
だけでいいんでは。


プリン体  2004-12-08 05:14:47  No: 87180

>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を読めるかどうか?というトコです。


java.lang.Nullpo  2004-12-08 05:20:39  No: 87181

> 実行ファイルと同じ場所です。
> Public Declare Sub someFunc Lib "something.dll" ()

フツー読めると思うんだけどなぁ・・・ orz
しかも前までは読めていたのだから不思議・・・


プリン体  2004-12-08 05:23:27  No: 87182

>フツー読めると思うんだけどなぁ・・・ orz
>しかも前までは読めていたのだから不思議・・・

同感です(;o;)
でも実際読めていたbmpも突然読めなくなって
App.Pathで回復したので、dllのほうもどーにかしたいですね。


まき  2004-12-08 05:37:39  No: 87183

>1、アプリケーションの起動ディレクトリ
>2、カレントディレクトリ 
>3、Windows のsystemディレクトリ 
>4、Windows ディレクトリ 
>5、環境変数 PATH に記述されているディレクトリ 

アプリの処理の途中でなんらかの原因でカレントディレクトリが変わってしまって
いると思いますが、上記5.は試行されましたか?

3,4、は対象外みたいですから、5、で解決するなら、1,2が変わったと
うことになると思いますが・・

エラー時にカレントディレクトリを表示してみてはいかがでしょう?


プリン体  2004-12-08 06:28:10  No: 87184

まきさん

>5、環境変数 PATH に記述されているディレクトリ 

申し訳ないのですが、これはどうやって設定するのでしょうか??


ねろ  2004-12-08 06:29:14  No: 87185

>フツー読めると思うんだけどなぁ・・・ orz
>しかも前までは読めていたのだから不思議・・・
同感です、何か勘違いがあるのでしょう。
もう一度目を凝らして良く見て下さい。
DLLの名前が違うなどと言う事は絶対無いですよね!!
どうしてもダメな場合は、EXEと同じ所にあるDLLをWindowsの
Systemの中に移動してみましょう。
それとApp.Pathですが標準モジュールの中なので使用できないのではなく、
使用している場所がプロシジャーの外なので使用できないのです。
しかもDeclareの宣言の中で文字列の結合なんて出来ないでしょう。
書いているうちに他のレスがつきましたが、
しかしカレントディレクトリは変わりますが、起動ディレクトリは
変わらないと思うんですが。。。。


java.lang.Nullpo  2004-12-08 06:38:34  No: 87186

SYSTEM32に移動してみて試したらどうでしょう。
それでもダメなら、DLLが破壊されてる?


プリン体  2004-12-08 08:03:07  No: 87187

解決しました!!

結局DLLはSYSTEM32に移動して解決でした。

皆様、長々とありがとうございました!!

…次は、実行ファイルと同じ場所にDLLを置く(簡単な)方法を考えます。


さて  2004-12-08 09:26:49  No: 87188

マルチポスト先には、なぁ〜んの連絡も無しですか。

貴方のような人が居るから、マルチポストは嫌われるのです。


ポリンキー  2004-12-08 11:32:01  No: 87189

>さて
まぁ落ち着け。

>実行ファイルと同じ場所にDLLを置く(簡単な)方法を考えます。
App.Pathで実現できないのか??


java.lang.Nullpo  2004-12-08 18:08:59  No: 87190

SYSTEM32 に移動したら動いたってことは、
同名のファイルが、優先順位が高いディレクトリに存在していた?

あ、でも起動ディレクトリが最優先だよなぁ・・・ うー、ワカラン(w

<Warning>
  マルチポストした場合は、ちゃんとフィードバックしておいてください。
  でないと、解決してるのにも関わらず回答者にムダな労力を使わせることになります。
  これは、大変失礼な行為です。
  回答者は、あなたの都合の良い家庭教師でもなければ、検索エンジンでもないのです。
</Warning>


山兼  2005-12-11 04:53:21  No: 87191

質問者様と同じ様な症状で悩んでいます。
開発環境はVB6 SP6 でWindowsXP Proです

私の場合はCommonDialog2.ShowOpenでプログラムを置かた場所以外のファイルを開き、もう一度プログラムを再起動させると
「実行時エラー'53' myfunc.DLLが見つかりません」
となります。
原因を考えるうちに、カレントディレクトリが変更されているみたいなのでとりあえず、
Private Sub Form_Load()
    ChDrive App.Path
    ChDir App.Path
    ・・・以下略・・・
End Sub
でもダメでした。

自作DLLなため、あまりSystem32に入れたくありません。
何か良い解決手段をお願い致します。


ガッ  2005-12-11 09:12:16  No: 87192

※回答ではありません。
  というより回答は出来ないかも;

> 山兼さん
人のスレに便乗はやらないでください。
収集が付かなくなってしまう恐れがあります。
また、既に回答済みのスレですので見ない人もいるかもしれません。

なので、ここは一旦終了と宣言して、新たにスレを作ってみてください。

では。


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

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






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