当前位置:  开发笔记 > 运维 > 正文

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

如何解决《Win32:注册ActiveX控件所需的注册表项?》经验,为你挑选了3个好方法。

我需要编写调用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"?

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



1> Ian Boyd..:

到目前为止我所知道的.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,有些使用两者.

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

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



2> Shog9..:

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

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

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

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



3> Franci Penov..:

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

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

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

查看MSDN ActiveX示例.

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

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有