私がこれまでに知っていること。COM はclsidに基づいてオブジェクトを作成します。これは、そのクラスを一意に識別する GUID です。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
次に、そのクラスを使用してオブジェクトを作成します。COM は、その COM オブジェクトを保持する DLL がどこにあるかを知る必要があります。私の特定のケースでは、COM オブジェクトを公開する「サーバー」は DLL であり、「処理中」になります。次に、以下を追加して、COM をその「インプロセス」DLL にポイントします。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\InprocServer32
(default) = "c:\foo\myActiveX.ocx"
COM は、COM サーバー オブジェクトがサポートするスレッド モデルも認識する必要があります。最も単純で最も一般的で、この例で使用されているのは、「アパートメント」スレッド モデルです。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\InprocServer32
(default) = "c:\foo\myActiveX.ocx"
ThreadingModel = "Apartment"
次は ProgID です。これは、DNS を使用してフレンドリ名を IP に変換する方法に似ています。ここでは、フレンドリ名"MyCoolLibrary.MyCoolControl"
を醜い clsid に変換します。"{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\InprocServer32
(default) = "c:\foo\myActiveX.ocx"
ThreadingModel = "Apartment"
HKEY_CLASSES_ROOT
\MyCoolLibrary.MyCoolControl
\Clsid
(default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
今、誰かが求めることができます
MyCoolLibrary.MyCoolControl
COMはそれをClassIDに変換できます
{AE8530CF-D204-4877-9CAB-F052BF1F661F}
COM がクラス ID を取得すると、その下のレジストリHKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
を調べて実際の情報を見つけることができます。
楽しみのために、ProgID が Clsid セクションに追加されています。これは、人々がこのクラスが何であるかを理解できるようにするためです。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\InprocServer32
(default) = "c:\foo\myActiveX.ocx"
ThreadingModel = "Apartment"
\ProgID
(default) = "MyCoolLibrary.MyCoolControl"
HKEY_CLASSES_ROOT
\MyCoolLibrary.MyCoolControl
\Clsid
(default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
次はタイプライブラリです。これはインプロセスではほとんど重要ではありませんが、COM オブジェクトが別の「アパートメント」にある場合は、関数パラメーターをマーシャリングする必要があります。すべてのクラス メソッドを定義するタイプ ライブラリがある場合、COM はこれを自動的に行います。
clsid セクションは、TypeLib キーを追加して、適切なタイプ ライブラリを指しています。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\InprocServer32
(default) = "c:\foo\myActiveX.ocx"
ThreadingModel = "Apartment"
\ProgID
(default) = "MyCoolLibrary.MyCoolControl"
\TypeLib
(default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
\MyCoolLibrary.MyCoolControl
\Clsid
(default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
このタイプ ライブラリに関する情報はレジストリにも保存されますが、これらのキーの追加は、RegisterTypeLibへの呼び出しによって行われます。ただし、次のようなキーが追加されます。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\InprocServer32
(default) = "c:\foo\myActiveX.ocx"
ThreadingModel = "Apartment"
\ProgID
(default) = "MyCoolLibrary.MyCoolControl"
\TypeLib
(default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
\MyCoolLibrary.MyCoolControl
\Clsid
(default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
HKEY_CLASSES_ROOT
\TypeLib
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\1.0
(default) = "My Cool ActiveX Library"
...
ここで、うまくいけばActiveX コントロールを機能させるために必要なトリッキーな内容に入ります。
MSDN の記事では、ダミーのプログラマブルキーを追加して、それが ActiveX コントロールであることを示す必要があると記載されています。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\Programmable
しかし、この MSDN ライブラリ ページでは、キーワードはControlであり、Programmableではなく、Programmable キーはありません。
しかし、一部の ActiveX は Control を使用し、一部は Programmable を使用し、一部は両方を使用しています。
他に必要なものについて言及しているものが見つかりません。
それで、誰かが決定的なドキュメントを見つけることができますか?