DLLのパスについて


ESP  2006-09-27 01:31:08  No: 96728

初心者で申し訳ありません。
XP, VB6.0です。 
DLLを使ったプログラムを作成しています。
プログラム(プロジェクト)はまず自分のフォルダ内のDLLを探すものだと思っていましたので
DLLをプロジェクトと同じフォルダにコピーし、DLL関数を定義したbasファイル内では以下のように記述していました。

Declare Function FuncA Lib "DLLA.dll" (ByVal data1 As Integer) As Integer

しかしDLLが見つからずエラーとなり、いろいろ調べたあげく、"DLLA.dll"をフルパスで指定したら
動くようになりました。今までこのようなことはありません(気付きません)でしたので、
このプロジェクトに限り、何らかの設定が変わったのかと思います。

概略ではカレント->システム->環境変数に指定してあるパスという順だと思っていたのですが、
そのあたりの設定はプロジェクトなどにあるのでしょうか?
あるいは他の要因(OS,開発環境のバージョン,DLLサイズ,関数の数など)に依存するものでしょうか?
よろしくお願いします。


ヤマ@文系  2006-09-27 02:05:27  No: 96729

今まではシステムというかレジストリにきちんと情報が登録されていたとかでしょうか?
>DLLをプロジェクトと同じフォルダにコピー
デバッグしているときはプロジェクトファイルのフォルダに
実行ファイルがあるわけでもないと思います。
コンパイルすれば
同じフォルダでも大丈夫では?


あん  2006-09-27 02:16:58  No: 96730

Visual StudioがあるフォルダにDLLを
置いてみてください。
動くはずです。

デバックとコンパイル後では
動作が異なることに注意してください。


我龍院忠太  2006-09-27 02:32:35  No: 96731

ChDir App.Path を呼び出す前に入れておけばいいかな。


ESP  2006-09-27 02:44:27  No: 96732

ご回答ありがとうございます。
システムフォルダに旧バージョンがあったためそちらが動いていたようです。
それを削除したところ正常に動くようになりました。
ただ、考えていた優先順と違うのが気になりますが。


Blue  2006-09-27 02:49:40  No: 96733

>ただ、考えていた優先順と違うのが気になりますが。
とは?

一応WinAPIのLoadLibrary関数は
http://www.microsoft.com/japan/developer/library/Jpwinpf/_win32_loadlibrary.htm
より
<MSDN>
1.アプリケーションのロード元ディレクトリ

2.カレントディレクトリ

3.Windows 95/98:Windows のシステムディレクトリ。このディレクトリのパスを取得するには、GetSystemDirectory 関数を使います。

Windows NT/2000:Windows の 32 ビット版システムディレクトリ。このディレクトリのパスを取得するには、GetSystemDirectory 関数を使います。このディレクトリの名前は、SYSTEM32 です。

4.Windows NT/2000:Windows の 16 ビット版システムディレクトリ。このディレクトリのパスを取得する Win32 関数はありませんが、このパスも自動的に検索の対象となります。このディレクトリの名前は、SYSTEM です。

5.Windows ディレクトリ。このディレクトリのパスを取得するには、GetWindowsDirectory 関数を使います。

6.環境変数 PATH に記述されている各ディレクトリ
</MSDN>
とあります。

(標準的検索順序の標準的に注目してもらいたい。)


ESP  2006-09-27 04:22:45  No: 96734

>>ただ、考えていた優先順と違うのが気になりますが。
>とは?

私の場合は明示的リンクではないですが、
システムよりカレントの方が優先されると思っていました。

上記LoadLibraryの説明もカレントの方が優先度が高いように見えます。
が、実際はシステムにあったDLLを削除したらカレントの方が動作したので、
実際の動作と、考えていた動作が異なるということです。


  2006-09-27 05:36:21  No: 96735

ふむ。
貴方がどのようにしてカレントを取得しているかは
知りませんが、次のコードを実行して見て下さい。
    ChDir App.Path
    Debug.Print "カレントDir:" & CurDir
    Debug.Print "アプリケーションパス:" & App.Path
    ChDir "c:\"
    Debug.Print "カレントDir:" & CurDir
    Debug.Print "アプリケーションパス:" & App.Path
つまりカレントDirはたまたまそこを指していただけで、
ある場所を特定している訳では無いのです。


ESP  2006-09-27 06:30:47  No: 96736

なるほど
そうでしたか、長いことプロジェクトと同じフォルダが
カレントになると思っていました。
ありがとうございました。


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

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






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