• ベストアンサー

VB6.0で、DLLを動的に参照したい

VB6.0では、DLLを利用する際の宣言部分で、パスを""で括った静的な記載でなく、動的な記載にできるのでしょうか。 色々と調べてみたのですが、イマイチピンとくるものがなかったので質問させていただきました。 例:Public Declare Function Ztest Lib "C:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long                           ↓動的に変更したい   Public Declare Function Ztest Lib "○○:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

できません。 Declareの場所は大域変数の宣言、つまり定数などを定義する 領域です。これをプログラム実行中に変更しようという行為 ですから、ダメな理由は分かると思います。 Basicではポインタを使用してメソッドを呼び出す手段が ありません。よって、動的なDLLのロードを行い、関数の アドレスを得ることはできますが、そこへ制御を移す手段が 無いのです。 但し、同じファイル名のDLL(中身は異なる)を別フォルダに 保存しておき、動的にどちらのフォルダからロードさせるかを 決めることはできます。方法はクラスオブジェクトを使います。 例えば、Class1に以下のような定義をします。 Private Declare Function Ztest Lib "Test1\Test2" _ Alias "Test3" (ByVal data1 As Long) As Long Public Function ZCall(ByVal data1 As Long) As Long ZCall = Ztest(data1) End Function 呼び出し側は次のようにします。 Dim C As Class1 Dim A1 As Long, A2 As Long SetCurrentDirectory "C:\AAA" 'カレント切り替え Set C = New Class1 'インスタンス生成 A1 = C.ZCall(0) 'メソッド実行 Set C = Nothing 'インスタンス消滅 SetCurrentDirectory "C:\BBB" 'カレント切り替え Set C = New Class1 'インスタンス生成 A2 = C.ZCall(0) 'メソッド実行 Set C = Nothing 'インスタンス消滅 DLLがシステムディレクトリになければカレントを探します。 クラスオブジェクトはインスタンス生成の度にDLLをロード しますので、その時にカレントを切り替えておくと似たような 処理にすることができます。標準モジュールは静的な空間なので、 ここでDLLを定義すると、ロードされたDLLを解放できません。

akirakunnn
質問者

お礼

返信が送れて申し訳ありません。 できないのですね。 了解しました。 ありがとうございます。

その他の回答 (1)

回答No.2

↓おもしろいものを見つけました。かなり技巧的ですが・・・。 http://nienie.com/~masapico/doc_FuncPtr.html

akirakunnn
質問者

お礼

返信が送れて申し訳ありません。 リンク先確認しました。 VB初心者ながら読んで理解してみましたが、残念ながら、やりたいことと少し違うように感じました。ただ、こういうことは可能だということは覚えておきます。 回答ありがとうございました。

関連するQ&A

専門家に質問してみよう