Win32:注册ActiveX控件所需的注册表项?

Ian*_*oyd 9 com registry winapi activex

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

regsvr32 myActiveX.ocx
Run Code Online (Sandbox Code Playgroud)

我正在尝试找到所需注册表项的最终列表(而不仅仅是我可以通过注册表拼写一起拼凑起来).

到目前为止,我的探险队发现:

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"
Run Code Online (Sandbox Code Playgroud)

现在,关注点: - Control文件夹包含什么?它的存在是否表示控制? - 什么是205201的MiscStatus呢?205202会做什么呢? - 什么是动词"属性,0,2"?哪里是"属性,0,0"和"属性,0,1"?

换句话说,我正在寻找文档.

Ian*_*oyd 11

到目前为止我所知道的.COM根据它的clsid创建一个对象.这是一个唯一标识该类的guid.

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
Run Code Online (Sandbox Code Playgroud)

然后该类用于创建对象.COM现在需要知道DLL在哪里容纳COM对象.在我的特定情况下,暴露COM对象的"服务器"是一个DLL,并且将"正在进行中".然后,我们通过添加以下内容将COM指向"进程中"dll:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
Run Code Online (Sandbox Code Playgroud)

COM还需要知道COM服务器对象支持的线程模型.最简单,最常见,以及本例中使用的是"Apartment"线程模型:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
Run Code Online (Sandbox Code Playgroud)

接下来是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}"
Run Code Online (Sandbox Code Playgroud)

现在有人可以要求

MyCoolLibrary.MyCoolControl
Run Code Online (Sandbox Code Playgroud)

和COM可以将其转换为ClassID

{AE8530CF-D204-4877-9CAB-F052BF1F661F}
Run Code Online (Sandbox Code Playgroud)

一旦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}"
Run Code Online (Sandbox Code Playgroud)

接下来是类型库.这主要是联合国在处理重要的东西,但如果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}"
Run Code Online (Sandbox Code Playgroud)

有关此类型库的信息也存储在注册表中,但是通过调用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"
           ...
Run Code Online (Sandbox Code Playgroud)

现在我们进入了棘手的东西,希望能够使ActiveX控件工作所需的东西.

MSDN文章声明您必须添加一个虚拟可编程键以指示它是一个ActiveX控件:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \Programmable
Run Code Online (Sandbox Code Playgroud)

但是这个MSDN Library页面说关键字是Control,而不是Programmable - 并且没有Programmable密钥.

但这并不能阻止某些ActiveX使用Control,有些使用Programmable,有些使用两者.

我找不到任何其他需要的东西.

那么,有人能找到一些明确的文件吗?


Sho*_*og9 5

拉里奥斯特曼提供了一个很好的起点:

这种"货物崇拜"性质的很大一部分是,可以为COM对象设置一组令人眼花缭乱的注册表设置,并且不清楚哪些(如果有的话)适用.所以我试图列出一系列文章,可以帮助人们确定他们需要设置什么.

- 注册COM对象需要哪些注册表项.

总结:它取决于您需要使用对象的场景.最基本,绝对必要的设置是默认值和ThreadingModel HKEY_CLASSES_ROOT\CLSID\<clsid>\,但大多数时候您也需要ProgID和AppID.


Fra*_*nov 5

通过Kraig Brockenschmidt查找/借用/窃取Inside OLE 2的副本.它像世界一样古老(也和我约会:-))

这里还是上面提到的注册表项的高级概述.

阅读Larry Osterman的博文,了解更多内容.

查看MSDN ActiveX示例.

此外,您缺少HKCR\Interfaces下的条目,用于控件实现的所有自定义接口和事件接口.