VBでプラグイン化

解決


まさやん  2003-12-01 21:33:12  No: 80665

VB6で後からDLLとかをロードすることって出来ますか?
例えば、TEST.EXEが実行された時に、あるフォルダに
後から追加されたDllを読込むとか…
(従って、プログラム開発時は、仕様が分かっていても、
Dll名が分かりません。)


魔界の仮面弁士  2003-12-01 23:42:17  No: 80666

Declareステートメントで使うタイプのDLLではなく、
ActiveX DLLとしてプラグイン化するという手法があります。

まず、各プラグインで共通するメソッドやプロパティの定義を
インターフェイスとして作成しておきます。

で、各プラグイン(これは、ActiveX DLLにします)は、
Implementsステートメントを使って、そのインターフェイスを
クラスモジュールに実装させればOKでしょう。

プラグインを利用する側は、
  Dim X As インターフェイス
  Set X = CreateObject(strProgramID)
という感じで、インスタンスを生成します。

でもってここで指定する strProgramIDは、iniファイル等から取得させる、と。


まさやん  2003-12-02 21:30:14  No: 80667

早速のご回答有り難うございます。
インスタンスの作成は、何となく分かるのですが
インターフェイスの作成がいまいちよく分かりません。
申し訳有りませんが、出来ましたら、
下記の内容を、もう少し詳しくご教授頂けないでしょうか。

>まず、各プラグインで共通するメソッドやプロパティの定義を
>インターフェイスとして作成しておきます。
>で、各プラグイン(これは、ActiveX DLLにします)は、
>Implementsステートメントを使って、そのインターフェイスを
>クラスモジュールに実装させればOKでしょう。


魔界の仮面弁士  2003-12-02 23:05:17  No: 80668

まず、プラグインに「どんなメソッドやプロパティを備えるか」を
事前に決定しておいて下さい。なお、この場合、メソッドやプロパティ名に
『アンダーバー(_)が含まれる名前』は使わないで下さい。

また、一度決定した後は、後から名前や型、あるいは引数などを
変更する事ができませんので、この仕様定義は、慎重に決めて下さい。

さて、メソッドの定義が決定したら、それをインターフェイスとして定義します。
# 本来は、タイプライブラリにてインターフェイスを定義するのが望ましいの
# ですが、とりあえずは、下記に示すように、ActiveX DLLでもOKでしょう。

1. ActiveX DLLプロジェクトを新規に作成し、プロジェクト名を"PluginBase"とする。
2. クラスモジュールの名前を"IPlugin"にする。
3. IPluginクラス(IPluginインターフェイス)に、先に決めたメソッド等の定義を、
   Public Function/Public Sub/Public Property Get, Let, Set で記述する。
   (この時、プロシージャ内にコードは書かず、空の定義だけにしておく)
4. このPluginBaseプロジェクトをコンパイルする。

これで準備OKです。基準となるインターフェイスが作成されました。
次に、プラグインDLLを作成します。

1. ActiveX DLLプロジェクトを新規に作成し、プロジェクト名を"PluginDLL1"とする。
2. クラスモジュールの名前を"CPlugin"にする。
3. 参照設定で、先のPluginBase.DLLをチェックしておく。
4. CPluginクラスに、「Implements IPlugin」と記述する。
5. コードウィンドウの左上のコンボ(オブジェクトボックス)から、IPluginを選択。
6. 続いて、右上のコンボ(プロシージャボックス)から、定義したプロシージャを選択。
7. 6の作業を繰り返し、全てのプロシージャ定義を作成する。
8. 各プロシージャ定義にて、必要な処理を実装する。
9. このPluginDLL1プロジェクトをコンパイルする。

これで、プラグインDLLの作成も完了です。
最後は呼び出し側です。

1. 標準EXEプロジェクトを新規に作成する。
2. 参照設定で、PluginBase.DLL をチェックしておく。

あとは、
    Dim O As IPlugin
    Set O = CreateObject("PluginDLL1.CPlugin")
のようにして生成すればOKです。


まさやん  2003-12-03 21:07:41  No: 80669

有難うございます。
早速、試してみたのですが、
この方法だと、レジストリに登録しないといけないみたいです。
Regsvr32などでレジストリに登録しなくても済む方法ってありますか?


まさやん  2003-12-04 21:41:24  No: 80670

自分で解決できました。
魔界の仮面弁士さん、ご丁寧説明頂き、有難う御座いました。
また、何か有れば宜しくお願いします。


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

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






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