VB6.0のEXEからEXE形式以外のVBプログラムを読み込む

解決


たかしま  2005-05-25 16:40:10  No: 121909  IP: [192.*.*.*]

VB6.0のEXEと同階層に配置されたEXE形式以外で作成されたVBプログラムを読み込む方法はあるのでしょうか?

目的としては既に作成されたEXEが用意されていて、再コンパイルせずに、
EXE形式以外で作成されたVBプログラムファイル(以下、"外部プログラム"と記述します)を
EXEと同階層に配置するだけで外部プログラムの機能を利用したいのです。
※もちろん、EXE側には外部プログラムを読み込むための記述が必要だと思いますが。

過去ログで調べましたところ、ActiveX DLLを利用する方法が紹介されていますが、
この場合、DLLが増えるたびにEXEの再コンパイルが必要ではないでしょうか?

EXEからは
  外部プログラム1.関数名(引数,引数,引数)
  外部プログラム2.関数名(引数,引数,引数)
  外部プログラム3.関数名(引数,引数,引数)
      ・・・
というような呼び出し方法をとりたいのです。
外部プログラム名はEXEと同階層に配置された外部プログラムファイルを総ナメして取得する。(これは可能でしょうか?)
関数名、引数、戻り値は全ての外部プログラムで仕様を統一します。


このような方法がVB6.0で可能なのでしょうか?
可能であれば参考になるリファレンス、書籍、WEBサイトなど紹介いただければ幸いです。
宜しくお願いします。

【環境】
    WIN2000 PRO SP4、WINXP HOME SP2
    VB6.0 SP5

編集 削除
魔界の仮面弁士  2005-05-25 19:21:44  No: 121910  IP: [192.*.*.*]

> この場合、DLLが増えるたびにEXEの再コンパイルが必要ではないでしょうか?
レイトバインドで実装すれば問題ないかと。

編集 削除
たかしま  2005-05-26 01:20:13  No: 121911  IP: [192.*.*.*]

魔界の仮面弁士 様  書き込みありがとうございます。

なるほど、DLL有り前提で作成するEXEだと、アーリーバインドで宣言して、
有るか無いか分からないDLLを利用する場合はレイトバインドで宣言するのですね。

こういう手段の有無から知らなかったので、大変助かります。


>>外部プログラム名はEXEと同階層に配置された外部プログラムファイルを総ナメして。
>>関数名、引数、戻り値は全ての外部プログラムで仕様を統一。
この部分を実現しようとすると、、、

Dim objGaibuProgram() As Object
Do While  ' EXEと同階層総ナメするまで
  Set objGaibuProgram(i) = CreateObject("外部プログラム.クラス名").関数名
Loop

こんな感じになるんでしょうかね。


ttp://www.int21.co.jp/pcdn/vb/vb5/bind/
こちらの記述を読んでみると、レイトバインドでは遅くなる可能性が指摘されているようですね。
今回の私の目的の場合、レイトバインドしか方法が無いのかもしれませんが。

早速試してみます。

ちなみに参考になりそうな書籍などがありましたら紹介いただけないでしょうか?

編集 削除
通ってみた  2005-05-26 04:03:31  No: 121912  IP: [192.*.*.*]

そのサイトのシメの文。

>>まず実際にやってみて、その場その場で最も良い方法を選んでいかなければならないし、 このような経験の積み重ねが、ノウハウという財産になっていくのではないかと思います。

編集 削除
たかしま  2005-05-26 21:17:57  No: 121913  IP: [192.*.*.*]

通ってみた 様  書き込みありがとうございます。

簡単なサンプルを作って試してみました。
まずは単純にひとつだけ、、、

Dim obj As Object
Set obj = CreateObject("Project2.Class1")
obj.fncAction

ちゃんとdll内の関数呼び出せました。



次に配列で試してみました。

Dim objArray(1 To 5) As Object
Dim i As Integer

For i = 1 To 5
    Set objArray(i) = CreateObject("Project2.Class1")
Next i
objArray(3).fncAction

これもすんなりとおりました。



Dim objArray() As Object
Dim i As Integer

Set objArray(1) = CreateObject("Project2.Class1")
Set objArray() = CreateObject("Project2.Class1")

このSetは上手くいきませんでした。
Object型の配列宣言はしっかりしないと駄目ということでしょうかね。


このまま、いろいろ自分なりにも調べつつ試していきます。
ありがとうございました。

編集 削除
魔界の仮面弁士  2005-05-26 21:59:29  No: 121914  IP: [192.*.*.*]

> このSetは上手くいきませんでした。
「ReDimステートメント」で、事前に配列サイズを割り当てましょう。

編集 削除
たかしま  2005-05-27 00:43:22  No: 121915  IP: [192.*.*.*]

魔界の仮面弁士 様  書き込みありがとうございます。

>「ReDimステートメント」で、事前に配列サイズを割り当てましょう。

今、ちょうどそこに気が付きました。
アドバイスありがとうござます。

編集 削除