Winapi Win32:注册ActiveX控件需要注册表项吗?

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}

我需要编写调用DllRegisterServer时运行的代码。i、 e.当有人打电话时:

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