[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/05/24(Thu) 14:10
投稿者名:そら
Eメール:
URL :
タイトル:
API関数のDLLファイル名の定数化について
いつも参考にさせていただいています。
今回、始めて投稿します。


今開発しているアプリケーションでAPI関数を使用するのですが、
API関数の定義で、「Lib」の後にDLLファイル名を指定していますが、
このDLLファイル名をIniファイル等から読み込んで設定することは可能でしょうか?

なぜ、そのようなことがしたいかと言うと、
DLLの置き場所を変更することがあり、また、多くのExeで使用しているので、
変更のたびにExeを作り直したくないのです。


開発環境
 OS:WindowsXP
 VB:6.0(SP6)

以下★は通常の定義方法なのですが、
この「"C:\TEST\Test.dll"」をIniファイルで定義し、
VBのソースでIniファイルから取得して変数:g_DLLPathに設定する。

--★---------------------------------------------------------------------
Declare Function Test Lib "C:\TEST\Test.dll" _
    (ByVal aaa As String, ByVal bbb As String, ByVal ccc As String, _
     ByVal ddd As String, ByVal eee As String, pData As KEKKA) As Long
-------------------------------------------------------------------------

「"C:\TEST\Test.dll"」にそのまま変数:g_DLLPathを定義しただけだと、
コンパイルエラーとなってしまいます。

教えていただきたいこと
1.API関数のDLLファイル名をIniファイル等から読み込んで設定することは可能か否か?
2.可能な場合、その設定方法


よろしくお願いします。

投稿時間:2007/05/24(Thu) 14:53
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: API関数のDLLファイル名の定数化について
> このDLLファイル名をIniファイル等から読み込んで設定することは可能でしょうか?

できません。

ゆえに一般的には、絶対パスを指定するのではなくファイル名のみを記載するようにします。
Lib 節にパスが含まれていない場合には、
  (1) App.Path
  (2) CurDir()
  (3) Windows のシステム ディレクトリ
  (4) Windows のディレクトリ
  (5) Environ("PATH") のディレクトリ
の順で DLL が検索されますので、これで対応することになるというわけです。

そういう意味では、(2)のカレント ディレクトリの切替によって対応できなくもないのですが、
DLL がロード/アンロードされるタイミングを制御しにくいため、実践的ではありません。
もし、無理矢理な方法を取るなら、LoadLibrary API を併用することになるでしょう。


> DLLの置き場所を変更することがあり、また、多くのExeで使用しているので、
> 変更のたびにExeを作り直したくないのです。
DLL の置き場を変更しないようにするのが、安全かつ楽な解決策かと思いますよ。

サイド バイ サイド実行だと割り切ってしまえば、DLL をアプリケーション間で共有せずに、
exe と同じディレクトリに固定配置することで、問題なく動くわけですし。

投稿時間:2007/05/24(Thu) 17:30
投稿者名:そら
Eメール:
URL :
タイトル:
Re^2: API関数のDLLファイル名の定数化について

魔界の仮面弁士さま

返信ありがとうございました。


DLLファイル名をIniファイル等から読み込んで設定することができないのは残念です、、、

絶対パスではなく、ファイル名のみ設定し、
アプリケーションと同じところに配置することも考えましたが、
DLL自体が使用するファイルが複数あり、それらに更新が入った場合は
全てのファイルを更新しなければならなくなります。

DLLの置き場を変更しないようにし、もし、置き場が変更された場合は、
Exeを作り直しで対応しようと思います。