我需要编写调用DllRegisterServer时运行的代码.即当有人打电话时:
regsvr32 myActiveX.ocx
我正在尝试找到所需注册表项的最终列表(而不仅仅是我可以通过注册表拼写一起拼凑起来).
到目前为止,我的探险队发现:
HKEY_CLASSES_ROOT \MyCoolLibrary.MyCoolControl \Clsid (default) = "{myClassId}" \CLSID \{myClassId} \Control \InprocServer32 (default) = "c:\foo\myActiveX.ocx" ThreadingModel = "Apartment" \MiscStatus \1 (default) = 205201 \ProgID (default) = "MyCoolLibrary.MyCoolControl" \ToolboxBitmap32 (default) = "c:\foo\myActiveX.ocx,1" \TypeLib (default) = "{myTypeLibraryGuid}" \Verb \0 (default) = "Properties,0,2" \Version (default) = "1.0" \TypeLib \{myTypeLibraryGuid} \1.0 (default) = "MyCoolLibrary.MyCoolControl"
现在,关注点: - Control文件夹包含什么?它的存在是否表示控制? - 什么是205201的MiscStatus呢?205202会做什么呢? - 什么是动词"属性,0,2"?哪里是"属性,0,0"和"属性,0,1"?
换句话说,我正在寻找文档.
到目前为止我所知道的.COM根据它的clsid创建一个对象.这是一个唯一标识该类的guid.
HKEY_CLASSES_ROOT \Clsid \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
然后该类用于创建对象.COM现在需要知道DLL在哪里容纳COM对象.在我的特定情况下,暴露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,有些使用两者.
我找不到任何其他需要的东西.
那么,有人能找到一些明确的文件吗?
拉里奥斯特曼提供了一个很好的起点:
这种"货物崇拜"性质的很大一部分是,可以为COM对象设置一组令人眼花缭乱的注册表设置,并且不清楚哪些(如果有的话)适用.所以我试图列出一系列文章,可以帮助人们确定他们需要设置什么.
- 注册COM对象需要哪些注册表项.
总结:它取决于您需要使用对象的场景.最基本,绝对必要的设置是默认值和ThreadingModel HKEY_CLASSES_ROOT\CLSID\
,但大多数时候您也需要ProgID和AppID.
通过Kraig Brockenschmidt查找/借用/窃取Inside OLE 2的副本.它像世界一样古老(也和我约会:-))
这里还是上面提到的注册表项的高级概述.
阅读Larry Osterman的博文,了解更多内容.
查看MSDN ActiveX示例.
此外,您缺少HKCR\Interfaces下的条目,用于控件实现的所有自定义接口和事件接口.