Winapi Win32:注册ActiveX控件需要注册表项吗?
我需要编写调用DllRegisterServer时运行的代码。i、 e.当有人打电话时:Winapi Win32:注册ActiveX控件需要注册表项吗?,winapi,com,activex,registry,Winapi,Com,Activex,Registry,我需要编写调用DllRegisterServer时运行的代码。i、 e.当有人打电话时: regsvr32 myActiveX.ocx 我试图找到所需注册表项的最终列表(而不仅仅是通过拼写注册表拼凑起来的内容) 到目前为止,我的探险队发现: HKEY_CLASSES_ROOT \MyCoolLibrary.MyCoolControl \Clsid (default) = "{myClassId}" \CLSID \{myClassId}
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"
现在,问题是:
-控制文件夹包含什么?它的存在是否表示控制?
-205201的错误状态是什么?205202会做什么呢?
-动词“属性,0,2”是什么?“属性0,0”和“属性0,1”在哪里
换句话说,我正在寻找文档。拉里·奥斯特曼提供了一个很好的起点: “货物崇拜”的很大一部分 这一点的本质是 是一套令人困惑的注册表 可以为COM设置的设置 对象,但不清楚哪一个,如果 任何人都可以申请。所以我想躺下来 写出一系列有帮助的文章 人们决定他们需要做什么 设定 --
总结:这取决于您需要在哪些场景中使用对象。最基本、绝对必要的设置是
HKEY\U CLASSES\U ROOT\CLSID\\\\\
中的默认值和ThreadingModel,但大多数情况下,您也需要ProgID和AppID。这不是详尽的,但请尝试MS知识库文章
还有一篇有用的博客文章
我突然想到,另一种方法是使用类似于的工具,直接监视调用DllRegisterServer方法时所做的注册表更改。无论如何,请阅读Larry Osterman的文章链接
此外,MSVC ATL COM对象向导生成的ATL注册器脚本是一个很好的起点。您可以使用不同的选项,并查看它们如何影响输出。查找/借用/窃取Kraig Brockenschmidt的Inside OLE 2的副本。它和世界一样古老(也和我约会:-) 下面是上面提到的注册表项的列表 阅读拉里·奥斯特曼的书,了解更多的建议 看看这些样品
此外,您的控件实现的所有自定义接口和事件接口的HKCR\Interface下都缺少条目。旁注如果您想通过实验查看创建了哪些键:使用Sysinternals',它将在您注册控件时实时捕获注册表上的活动。我目前所知道的。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。在这里,我们将一个友好的名称“mycollibrary.mycolcontrol”转换为丑陋的clsid“{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}"
有关此类型库的信息也存储在注册表中,但是添加这些键是通过调用来完成的。但它将为我们添加类似于:
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控件能够正常工作所需要的东西
您必须添加一个伪可编程键以指示它是ActiveX控件:
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\Programmable
但是说关键字是控制,而不是可编程——并且没有可编程键
但这并不能阻止一些ActiveX使用控件,一些使用可编程控件,还有一些同时使用这两种控件
我找不到任何提及其他要求的东西
那么,有人能找到一些明确的文档吗?您正在使用64位操作系统吗 如果是,请不要写信给
HKEY\U CLASSES\U ROOT\CLSID\
你应该写信给
HKEY\U CLASSES\U ROOT\Wow6432Node\CLSID\我是一名COM开发人员,一名新手。我有同样的问题。我想和大家分享一下。大多数框架不是都为您自动生成了吗?
可编程的
似乎是正确的关键——我无法在MSOffice中加载带有控件
和没有可编程的
的组件。此外,我建议在ProgID
(mycollibrary.mycolcontrol.1
)中附加一个版本号,并保留一个VersionIndependentProgID
,而不附加版本号。
HKEY_CLASSES_ROOT
\Clsid
\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
\Programmable