はじめまして、智と申します。
早速なのですが、DLLに複数のocxを持たせ、
それを、参照設定で参照したときに、ツールボックスに
DLLに含まれているocxを追加したいのですが、
そのようなことは可能なのでしょうか?
可能ならばその方法を教えて下さい。
よろしくお願いします。
「複数のocxをDLLに含める」のではなく、
「複数のコントロールを、1つのOCXに含める」のでは
駄目なのでしょうか?
複数のコントロールを1つのOCXに含め、
そのOCXをDLLに複数持たせて、参照設定で参照したいのですが?
無理でしょうか?
> そのOCXをDLLに複数持たせて、参照設定で参照したいのですが?
「コンポーネントの追加」と「参照設定」は別物です。
その作成したDLLを参照したとしても、それをフォームに貼って
使用する事はできません。
通常通り、「コンポーネントの追加」を利用してください。
コンポーネントでDLLは使えないのですか?
コンポーネントの中には拡張子がDLLのものも有るのですが、
参照で追加しようとしてもファイルの種類にDLLがないんですけど・・・
なにか誤解があるようですね。
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のように、本来コントロールにする必要のない
コントロールなら使う価値がないでもないでしょう。
>>コンポーネントでDLLは使えないのですか?
>拡張子をdllにできるか?という意味なら可能です。
>やろうと思えばtxtだろうとmdbだろうと可能です。
>拡張子には識別の参考になる以上の大きな意味はありません。
コンポーネントの追加でそれは指定できるのですか?
>>参照で追加しようとしてもファイルの種類にDLLがないんですけど・・・
>普通、拡張子Exeのファイルもいくらかあるのですが・・・。
>レジストリにdllしか登録されてないからでしょう。
>一度ActiveX Exeを作ってみれば、参照設定できるのが
>dllだけでないことがわかるでしょう。
コンポーネントの追加の参照ボタンで追加しようとしたときです。
>コンポーネントの追加でそれは指定できるのですか?
できます。
>コンポーネントの追加の参照ボタンで追加しようとしたときです。
ためしてみましたか?
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として登録」することができます。
しかし、本当にコントロールとして使えるか?は
あくまでファイルの内部構造に依存します。
DLLにOCXを組み込むことは可能ですか?
編集 削除質問の意味が不明確です。
どういう意味で「DLL」,「OCX」という単語を用いられてますか?
ひとつのファイルにコードコンポーネントとコントロールを
混在させることが可能か?という意味なら可能です。
複数のコントロールをもつOCXを複数作り、
その複数のOCXをDLLに持つということなのですが。
1.ActiveX DLL を作る。
2.そのActiveX DLLは複数のocxに依存する。
ということなら可能ですが、ActiveX DLL自体が
ユーザインターフェイスをもちませんので、「参照設定」して
インスタンスを生成して、ocxの機能の一部を利用することは
できても、「コンポーネントの追加」でツールボックスに
追加して利用することはできません。
コンポーネントの追加でツールボックスに追加したければ、
複数のOCXを1つのDLLにまとめようというのが間違っているんですね?
>複数のOCXを1つのDLLにまとめようというのが間違っているんですね?
ここでいう「DLL」がActiveX DLL という意味なら、そうです。
そうですか、わかりました。
何度もご返答頂きありがとうございました。