初心者で申し訳ありません。
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サイズ,関数の数など)に依存するものでしょうか?
よろしくお願いします。
今まではシステムというかレジストリにきちんと情報が登録されていたとかでしょうか?
>DLLをプロジェクトと同じフォルダにコピー
デバッグしているときはプロジェクトファイルのフォルダに
実行ファイルがあるわけでもないと思います。
コンパイルすれば
同じフォルダでも大丈夫では?
Visual StudioがあるフォルダにDLLを
置いてみてください。
動くはずです。
デバックとコンパイル後では
動作が異なることに注意してください。
ChDir App.Path を呼び出す前に入れておけばいいかな。
ご回答ありがとうございます。
システムフォルダに旧バージョンがあったためそちらが動いていたようです。
それを削除したところ正常に動くようになりました。
ただ、考えていた優先順と違うのが気になりますが。
>ただ、考えていた優先順と違うのが気になりますが。
とは?
一応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>
とあります。
(標準的検索順序の標準的に注目してもらいたい。)
>>ただ、考えていた優先順と違うのが気になりますが。
>とは?
私の場合は明示的リンクではないですが、
システムよりカレントの方が優先されると思っていました。
上記LoadLibraryの説明もカレントの方が優先度が高いように見えます。
が、実際はシステムにあったDLLを削除したらカレントの方が動作したので、
実際の動作と、考えていた動作が異なるということです。
ふむ。
貴方がどのようにしてカレントを取得しているかは
知りませんが、次のコードを実行して見て下さい。
ChDir App.Path
Debug.Print "カレントDir:" & CurDir
Debug.Print "アプリケーションパス:" & App.Path
ChDir "c:\"
Debug.Print "カレントDir:" & CurDir
Debug.Print "アプリケーションパス:" & App.Path
つまりカレントDirはたまたまそこを指していただけで、
ある場所を特定している訳では無いのです。
なるほど
そうでしたか、長いことプロジェクトと同じフォルダが
カレントになると思っていました。
ありがとうございました。
ツイート | ![]() |