到目前为止我所知道的。COM 基于它的clsid创建一个对象。这是一个唯一标识该类的指南。
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 服务器对象支持的线程模型。本例中使用的最简单、最常见的一种是“Apartment”线程模型:
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 有了 clasid,它就可以在下面的注册表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 Library 页面说关键字是Control,而不是Programmable - 并且没有 Programmable 键。
但这并不能阻止一些 ActiveX 使用 Control,一些使用 Programmable,还有一些两者都使用。
我找不到任何提到其他需要的东西。
那么,任何人都可以找到一些权威的文档吗?