DLLでコンポーネントの追加をするには?

解決


 2003-01-28 11:22:49  No: 76918  IP: [192.*.*.*]

はじめまして、智と申します。

早速なのですが、DLLに複数のocxを持たせ、
それを、参照設定で参照したときに、ツールボックスに
DLLに含まれているocxを追加したいのですが、
そのようなことは可能なのでしょうか?
可能ならばその方法を教えて下さい。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2003-01-28 11:32:02  No: 76919  IP: [192.*.*.*]

「複数のocxをDLLに含める」のではなく、
「複数のコントロールを、1つのOCXに含める」のでは
駄目なのでしょうか?

編集 削除
 2003-01-28 13:13:11  No: 76920  IP: [192.*.*.*]

複数のコントロールを1つのOCXに含め、
そのOCXをDLLに複数持たせて、参照設定で参照したいのですが?
無理でしょうか?

編集 削除
魔界の仮面弁士  2003-01-28 14:58:33  No: 76921  IP: [192.*.*.*]

> そのOCXをDLLに複数持たせて、参照設定で参照したいのですが?

「コンポーネントの追加」と「参照設定」は別物です。
その作成したDLLを参照したとしても、それをフォームに貼って
使用する事はできません。

通常通り、「コンポーネントの追加」を利用してください。

編集 削除
 2003-01-28 15:08:11  No: 76922  IP: [192.*.*.*]

コンポーネントでDLLは使えないのですか?
コンポーネントの中には拡張子がDLLのものも有るのですが、
参照で追加しようとしてもファイルの種類にDLLがないんですけど・・・

編集 削除
Say  2003-01-28 16:43:33  No: 76923  IP: [192.*.*.*]

なにか誤解があるようですね。

COMの世界の話になりますが、
COMには2種類あります。

ユーザインターフェイスを持つ「コントロール」と
ユーザインターフェイスをもたない「コードコンポーネント」です。

前者はVBから、「コンポーネントの追加」で追加すると
ツールボックスに追加され、それをForm上に配置して
プロパティを設定して使います。

後者は「参照設定」してDim 〜 NewやSet 〜CreateObjectなどで
インスタンスを生成して使います。

前者のファイルの拡張子は通常ocxで、後者は通常dllであることから、
コントロールを格納したファイルをocxファイル、
コードコンポーネントを格納したファイルをdllファイルと
呼ぶこともあります。

しかしながら、拡張子は単なる識別の目安でしかありませんし、
そもそもビルドされたコントロールのバイナリ構造は
dllと同一形式ですので、ocxの拡張子をdllに変えても
レジストリさえきちんと設定しておけばそれなりに動作します。

拡張子がdllだろうがocxだろうが、
ツールボックスに追加するのはVB側の機能です。
VBでは「コンポーネントの追加」で追加すると
ツールボックスに追加される仕組みになってますから、
「参照設定で参照したときに、ツールボックスに追加」は
VBの改造でもしない限り不可能です。

そして、VBの改造はライセンス契約違反になりますので、
事実上、「参照設定で参照したときに、ツールボックスに追加」
はできないことになります。

それを踏まえた上で
>コンポーネントでDLLは使えないのですか?
拡張子をdllにできるか?という意味なら可能です。
やろうと思えばtxtだろうとmdbだろうと可能です。
拡張子には識別の参考になる以上の大きな意味はありません。

>参照で追加しようとしてもファイルの種類にDLLがないんですけど・・・
普通、拡張子Exeのファイルもいくらかあるのですが・・・。
レジストリにdllしか登録されてないからでしょう。
一度ActiveX Exeを作ってみれば、参照設定できるのが
dllだけでないことがわかるでしょう。


余談ですが、非ビジュアルな使い方に限り、コントロールを
「コンポーネントの追加」で追加せずに使用することが可能です。

たとえば、MaskEditコントロールは、通常「コンポーネントの追加」で
追加して使用しますが、

Option Explicit

Private Sub Command1_Click()
    Dim objMask As Object
    
    Set objMask = CreateObject("MSMask.MaskEdBox")
    objMask.Text = "aaa"
    MsgBox objMask.Text
End Sub

のようにして、CreateObjectして、コードコンポーネントのように
使うことはできます。
ただし、VisibleやTop,Leftのような表示に関連する
プロパティは使えません。

こんな方法、使う意味があるか、といわれると疑問ですが、

TimerやMSCommのように、本来コントロールにする必要のない
コントロールなら使う価値がないでもないでしょう。

編集 削除
 2003-01-30 08:35:08  No: 76924  IP: [192.*.*.*]

>>コンポーネントでDLLは使えないのですか?
>拡張子をdllにできるか?という意味なら可能です。
>やろうと思えばtxtだろうとmdbだろうと可能です。
>拡張子には識別の参考になる以上の大きな意味はありません。
コンポーネントの追加でそれは指定できるのですか?


>>参照で追加しようとしてもファイルの種類にDLLがないんですけど・・・
>普通、拡張子Exeのファイルもいくらかあるのですが・・・。
>レジストリにdllしか登録されてないからでしょう。
>一度ActiveX Exeを作ってみれば、参照設定できるのが
>dllだけでないことがわかるでしょう。
コンポーネントの追加の参照ボタンで追加しようとしたときです。

編集 削除
Say  2003-01-30 09:41:00  No: 76925  IP: [192.*.*.*]

>コンポーネントの追加でそれは指定できるのですか?
できます。

>コンポーネントの追加の参照ボタンで追加しようとしたときです。

ためしてみましたか?
ActiveXコントロールの追加ダイアログで
ファイルの種類を「すべてのファイル(*.*)」にすれば
どんな拡張子であろうと参照可能です。

ただし、コンポーネントとして必要なファイル構造をしていなければ、
「登録できない」といわれるだけですが・・・。

さて、ひとつ実験をしてみましょう。

VBを起動します。
「新しいプロジェクト」ウィンドウの新規作成タグで
ActiveXコントロールを選択します。

今回は、拡張子のテストですから、特に画面の加工は不要ですが、
気になるならUserControl上に適当にコントロールを
貼り付けてください。

識別しやすいように、Project名をprjUser1,
UserControlのオブジェクト名をusr1に変更して、
適当なフォルダに保存します。
ファイル→prjUser1.ocxの作成を選択し、
「実行可能ファイルの作成」ダイアログで、ファイル名
prjUser1.ocxとなっていますから、適当に変更します。
ここでは prjUser1.txt としてみましょう。
「OK」を押すと、コンパイルされ、先ほどの保存フォルダに
prjUser1.txtが作られます。

しかし、このファイルをダブルクリックしたりして
メモ帳などのエディタで開いてはいけません。
拡張子こそtxtとなってますが、テキストファイルではなく、
れっきとしたいわゆる「ocxファイル」です。
より正確にはビルドされた「ユーザインターフェイスをもつCOM」
ファイルです。

確かめてみましょう。さっきのprjUser1のエディトを終了し、
新規に標準Exeをおこします。
プロジェクト→コンポーネントを選択し、コンポーネントダイアログを
探すと、prjUser1が見つかります。
クリックして、「場所」を見るとprjUser1.txtとなってますね。
チェックをいれて「OK」を押すと、ツールボックスに配置され、
普通のコントロールと同じようにFormに配置できます。

では、なぜ拡張子がtxtなのにocxファイルと認識したのでしょう?
それは、コンパイルしたときにVBがレジストリに
「prjUser1.txtはocxファイルである」という情報を
書き込んだからです。

ということは、手作業でレジストリを書き換えれば
どんなファイルでも「ocxとして登録」することができます。
しかし、本当にコントロールとして使えるか?は
あくまでファイルの内部構造に依存します。

編集 削除
 2003-01-30 11:08:36  No: 76926  IP: [192.*.*.*]

DLLにOCXを組み込むことは可能ですか?

編集 削除
Say  2003-01-30 12:05:39  No: 76927  IP: [192.*.*.*]

質問の意味が不明確です。
どういう意味で「DLL」,「OCX」という単語を用いられてますか?

ひとつのファイルにコードコンポーネントとコントロールを
混在させることが可能か?という意味なら可能です。

編集 削除
 2003-01-30 12:12:59  No: 76928  IP: [192.*.*.*]

複数のコントロールをもつOCXを複数作り、
その複数のOCXをDLLに持つということなのですが。

編集 削除
Say  2003-01-30 12:56:20  No: 76929  IP: [192.*.*.*]

1.ActiveX DLL を作る。
2.そのActiveX DLLは複数のocxに依存する。

ということなら可能ですが、ActiveX DLL自体が
ユーザインターフェイスをもちませんので、「参照設定」して
インスタンスを生成して、ocxの機能の一部を利用することは
できても、「コンポーネントの追加」でツールボックスに
追加して利用することはできません。

編集 削除
 2003-01-30 13:21:08  No: 76930  IP: [192.*.*.*]

コンポーネントの追加でツールボックスに追加したければ、
複数のOCXを1つのDLLにまとめようというのが間違っているんですね?

編集 削除
Say  2003-01-30 13:28:57  No: 76931  IP: [192.*.*.*]

>複数のOCXを1つのDLLにまとめようというのが間違っているんですね?
ここでいう「DLL」がActiveX DLL という意味なら、そうです。

編集 削除
 2003-01-30 13:51:04  No: 76932  IP: [192.*.*.*]

そうですか、わかりました。
何度もご返答頂きありがとうございました。

編集 削除