掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
使用するDLL内の関数を任意名称で使用するには? (ID:77829)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
環境は何でしょうか? 一口にVBといっても、VB2〜VB4/16, VB4/32, VB5, VB6, eVB, VB.NET, VBScript, Office VBA等々ありますが…。 > これを将来、DLLファイル名称、関数名称が変わっても再コンパイル等しなくても > 使用する方法はあるのでしょうか? ActiveX DLLの場合は、参照設定をせず、 CreateObject関数で呼ぶようにすれば良いかと思います。 例えば、ProgIdをiniファイル等から得るようにして、 Set X = CreateObject(strProgID) A = X.Proc1() B = X.Proc2() のようなコードにするわけです。 この場合、メソッド名や引数の仕様などといったインターフェイス部は、 各DLL間ですべて同じにしておく必要があります。 もしも、関数名称や引数仕様まで動的に指定した場合は、 VBScriptではEval関数(*1)やExecuteステートメント、 VB6ならCallByName関数を利用する事が可能です。 (*1) Eval関数: ちなみにEVal関数は、Access VBAにも存在するのですが、 VBScriptのEValとは若干動作が違うので、今回の目的に使うのには 向いてないと思います。 さて。VB4/32, VB5, VBA等の場合ですが———これらの環境では、 関数名を指定して呼び出す事はできませんので、TLBINF32.DLLを使うか、 もしくはOLE系のAPIを直接呼び出すことで、DLLのメソッド等を 呼び出す事になるでしょう。 といっても、この方法だと非常に煩雑な処理になる事が予想されますので、 かわりにWindows Script Controlコンポートネント(*2)を使い、 VBScriptを経由(*3)して処理する方法をとると良いかと思います。 (*2) Windows Script Controlコンポートネント: ScriptControlに関しては、下記を参照してください。 http://www.microsoft.com/japan/msdn/scripting/maininfo.htm (*3) VBScriptを経由: VBScriptの代わりに、JScriptやPerlScriptでも良いですけどね。(^_^;) 一方、ActiveX DLLではなく、Declareして使うタイプのDLLの場合ですが… 残念ながら、DeclareステートメントのLib句が固定表記であるため、 VBではDLL名を動的に変更して呼ぶ事ができません。 LoadLibrary+CallWindowProc(+FreeLibrary)を使うとか、 アセンブラをメモリに書き込んで実行するという強行手段(*3)が あるにはありますが…あまりマトモな方法ともいえないでしょうね。 (*3) 強行手段: 下記参照 http://members.tripod.com/~masapico/doc_FuncPtr.html ただし、C++等にて「DLLを呼び出すためのDLL」を作成できるのであれば、 この問題を解決できると思います。あるいは、DynaCall(*4)をインストールして、 それをDeclareステートメント代わりに使うという方法もあります。 例えば、DynaCallを使った場合は以下のようなコードが書けます。 FilePath = "C:\Program Files" With CreateObject("DynamicWrapper") .Register "SHLWAPI.DLL", "PathFileExistsA", "i=s", "f=s", "r=l" If .PathFileExistsA(FilePath & vbNullChar) = 0 Then MsgBox "存在しません:" & FilePath Else MsgBox "存在します:" & FilePath End If End With (*4) DynaCall: 下記を参照の事。 http://members.tripod.co.jp/IUnknown/WSH/dwhelper/topics/ http://www.borncity.com/WSHBazaar/WSHDynaCall.htm
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.