COM简介

COM简介,com,vb6,Com,Vb6,当我开始上大学时,Java和.NET是用于教学的技术 在过去的三年中,我已经熟悉并积累了使用基于COM(组件对象模型)的语言(如VB6)的经验。我从较高的层次上理解了基于COM的语言和更现代的语言之间的差异 我不明白注册表里发生了什么。例如,我执行以下命令: regsvr32 myDLL.dll 然后我可以在HKEY\U LOCAL\U MACHINE\SOFTWARE\Classes\CLSID下找到一个条目。这是VB6程序的唯一条目吗?例如,如果我执行了以下操作,那么DLL是否仍然可用:

当我开始上大学时,Java和.NET是用于教学的技术

在过去的三年中,我已经熟悉并积累了使用基于COM(组件对象模型)的语言(如VB6)的经验。我从较高的层次上理解了基于COM的语言和更现代的语言之间的差异

我不明白注册表里发生了什么。例如,我执行以下命令:

regsvr32 myDLL.dll
然后我可以在HKEY\U LOCAL\U MACHINE\SOFTWARE\Classes\CLSID下找到一个条目。这是VB6程序的唯一条目吗?例如,如果我执行了以下操作,那么DLL是否仍然可用:

  • 正确注册DLL:regsvr32 myDLL.DLL
  • 导出注册表项:HKEY\U LOCAL\U MACHINE\SOFTWARE\Classes\CLSID\
  • 正确注销DLL:regsvr32-u myDLL.DLL
  • 导入在步骤2中导出的注册表项

  • 我尝试过这个方法,但没有成功。

    虽然.NET程序集直接在生成的.EXE或.DLL文件中包含其类型定义(类、方法等),但COM组件没有,因此需要先“注册”才能识别


    注册和注销过程独立于存储的.DLL文件运行。因此,注销COM组件不会删除.DLL文件,而只会删除用于标识它的信息。

    虽然.NET程序集直接在生成的.EXE或.DLL文件中包含其类型定义(类、方法等),但COM组件不会,因此需要先“注册”才能标识

    注册和注销过程独立于存储的.DLL文件运行。因此,注销COM组件不会删除.DLL文件,而只是删除用于标识它的信息

    然后我可以在:HKEY Local Machine CLSID下找到一个条目。是这个吗 仅为VB6程序创建的条目

    不,有;例如
    \TYPELIB
    SOFTWARE\CLASSES\PROGID
    其中
    PROGID
    yourserver.YourClass
    标识符

    注销组件时,这些组件将被删除,因此重新导入CLSID密钥不会恢复功能

    如果类型定义未存储在文件中(在 已注册),那么它们是否已存储

    COM DLL可以在内部将其类型库存储为二进制类型库资源

    然后我可以在:HKEY Local Machine CLSID下找到一个条目。是这个吗 仅为VB6程序创建的条目

    不,有;例如
    \TYPELIB
    SOFTWARE\CLASSES\PROGID
    其中
    PROGID
    yourserver.YourClass
    标识符

    注销组件时,这些组件将被删除,因此重新导入CLSID密钥不会恢复功能

    如果类型定义未存储在文件中(在 已注册),那么它们是否已存储


    COM DLL可以在内部将其类型库存储为二进制类型库资源。

    请记住,regsvr32不是魔术。它加载目标DLL(或OCX)并调用该库的自注册入口点。这通常会生成一个或多个类、progid和类型库的基本注册,只要VB6编译器生成一个类、progid和类型库,类型库就会嵌入到此类DLL中。ActiveX EXE以类似的方式执行自注册,但不通过外部调用程序。而是通过
    regserver
    命令行开关来执行EXE的特殊运行

    自我注册不是在目标系统上安装这些东西的首选方式。这只是编译器可以生成的最小、最基本的注册,而无需了解开发人员的想法。它还完全跳过在注册表中创建重要的服务条目,如卸载程序链接、创建/增加使用计数等。而且它无法生成代码可能依赖的大量其他注册表项(shell扩展信息、数据文件类型/扩展关联、服务信息、DCOM激活参数等)

    其他编译器提供在单独的typelib文件中创建类型信息的选项,但VB6没有

    所以你的建议是合理的,但遗漏了很多东西。首先,您省略了在
    HKEY\u CLASSES\u ROOT\typelib\
    下找到的类型信息(typelib)注册,但在
    HKEY\u CLASSES\u ROOT\
    下也有ProgId信息,依此类推

    有关更多信息,请参阅

    请记住,VB6不创建原始COM组件,而是创建ActiveX组件,ActiveX组件是COM的超集,用于添加OLE2的方面


    .Net依赖于基于文件位置的更原始的类似Java的机制,除非您使用GAC程序集(注册表发布的.Net版本)。

    请记住,regsvr32不是魔术。它加载目标DLL(或OCX)并调用该库的自注册入口点。这通常会生成一个或多个类、progid和类型库的基本注册,只要VB6编译器生成一个类、progid和类型库,类型库就会嵌入到此类DLL中。ActiveX EXE以类似的方式执行自注册,但不通过外部调用程序。而是通过
    regserver
    命令行开关来执行EXE的特殊运行

    自我注册不是在目标系统上安装这些东西的首选方式。这只是编译器可以生成的最小、最基本的注册,而无需了解开发人员的想法。它还完全跳过在注册表中创建重要的服务条目,如卸载程序链接、创建/增加使用计数等。而且它无法生成代码可能依赖的大量其他注册表项(shell扩展信息、数据文件类型/扩展关联、服务信息、DCOM激活参数等)