主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

注册 COM 组件

自注册组件

MATLAB® Compiler SDK™ 产品创建一个组件时,它会自动生成一个称为类型库的二进制文件。作为构建的最后一步,此文件作为资源与生成的 DLL 绑定。

MATLAB Compiler SDK COM 组件都是自注册的。自注册组件包含从系统注册表中添加或删除自身完整描述所需的所有代码。mwregsvr 实用工具与 MATLAB Runtime 一起分发,用于注册自注册 DLL。

安装到特定计算机上的组件必须使用 mwregsvr 注册。如果将组件移动到同一台计算机上的其他文件夹,则必须重复注册过程。从特定计算机上删除组件时,首先取消注册以确保注册表不会保留错误信息。

提示

mwregsvr 实用工具调用与 regsvr32.exe 类似的进程,不同之处在于 mwregsvr 不需要与控制台上的用户交互。regsvr32.exe 进程属于 Windows® 操作系统,用于在注册表中注册动态链接库和 Microsoft® ActiveX® 控件。该程序对于您的计算机的稳定和安全运行非常重要,不应终止。调用 mwregsvr 时必须指定组件的完整路径,或者从组件所在的文件夹进行调用。您可以使用 regsvr32.exe 作为 mwregsvr 的替代来注册您的库。

注册加载项和 COM 组件

注意

MATLAB Compiler™MATLAB Compiler SDK 中均使用 COM 组件,因此一些与构建和打包 COM 组件和加载项有关的说明可以在产品之间共享。

当您创建 COM 组件时,它会根据您的登录特权在 HKEY_LOCAL_MACHINEHKEY_CURRENT_USER 中注册。

如果您发现由于 Microsoft 或您的安装所施加的安全标准而需要更改运行时权限,则可以在部署 COM 组件或加载项之前执行以下操作之一:

  • 运行 COM 组件或加载项之前以 administrator 身份登录

  • 在运行 COM 组件或加载项之前运行以下 mwregsvr 命令,如下所示:

    mwregsvr [/u] [/s] [/useronly] project_name.dll 
    其中:

    • /u 允许任何用户取消注册此服务器的 COM 组件或加载项

    • /s 静默运行此命令,不生成任何消息。这对于静默安装很有帮助。

    • /useronly 仅允许当前登录的用户在此服务器上运行 COM 组件或加载项

小心

如果您的 COM 组件在 USER 配置单元中注册,则在启用了 UAC (User Access Control) 的系统上以 administrator 身份运行的 Windows Vista®Windows 7 用户将看不到它。

如果您在 Windows 7 或 Windows Vista 下将组件注册到 USER 配置单元,则在以提升的 (administrator) 特权运行时,您的 COM 组件可能无法加载。

如果发生这种情况,请执行以下操作将组件重新注册到 LOCAL MACHINE 配置单元:

  1. 用以下命令取消注册该组件:

    mwregsvr /u /useronly my_dll.dll
    

  2. 使用以下命令将组件重新注册到 LOCAL MACHINE 配置单元:

    mwregsvr my_dll.dll

全球唯一标识符

信息作为具有一个或多个关联命名值的键存储在注册表中。键本身的值主要有两种类型:可读字符串和 GUID。(GUID 是“全局唯一标识符”的缩写,是一个 128 位整数,保证始终唯一。)

编译器会自动为在构建时在组件内定义的 COM 类、接口和类型库生成 GUID,并将这些密钥编码到组件的自注册代码中。

系统注册表的接口是基于文件夹的。COM 相关的信息存储在名为 HKEY_CLASSES_ROOT 的顶级键下。HKEY_CLASSES_ROOT 下还有其他几个键,编译器在这些键下写入组件信息。

小心

在构建期间不要删除您的工程的 src 文件夹中的 DLL 文件。这样做会导致在后续构建中重新生成 GUID。要保留旧版本的 DLL,请在重建工程之前在系统上注册它。

请参阅下表以获取按键列表及其定义。

定义
HKEY_CLASSES_ROOT\CLSID

有关系统上的 COM 类的信息。每个组件都会在 HKEY_CLASSES_ROOT\CLSID 下为其每个 COM 类创建一个新键。创建的密钥具有已分配给该类的 GUID 值,并且包含几个带有有关该类信息的子密钥。

HKEY_CLASSES_ROOT\Interface

有关系统上的 COM 接口的信息。每个组件在 HKEY_CLASSES_ROOT\Interface 下为其定义的每个接口创建一个新键。该项具有分配给接口的 GUID 值,并包含带有有关该接口信息的子项。

HKEY_CLASSES_ROOT\TypeLib

有关系统类型库的信息。每个组件都会为其类型库创建一个键,并为其分配 GUID 的值。在此键下为类型库的每个版本创建一个新键。因此,具有相同名称的类型库的新版本将重用原始 GUID,但为新版本创建一个新的子项。

HKEY_CLASSES_ROOT\<ProgID>, HKEY_CLASSES_ROOT\<VerIndProgID>

这两个键是为组件的程序 ID 和版本独立程序 ID 创建的。这些键由以下形式的字符串构成:

component-name.class-name
component-name.class-name version-number

这些键对于从组件和类名(而不是 GUID)创建类实例很有用。

版本控制

MATLAB Compiler SDK 组件支持简单的版本控制机制,旨在轻松构建和实现同一组件的多个版本。组件的版本号作为 DLL 名称的一部分出现,同时也是系统注册表中版本相关 ID 的一部分。

当创建一个组件时,可以指定一个版本号。(默认值为 1.0。)在组件特定版本的开发过程中,版本号应该保持不变。完成此操作后,在某些情况下,MATLAB Compiler SDK 产品会在组件的每个后续构建中重复使用类型库、类和接口 GUID。这避免了在多次构建期间为同一组件创建过多的注册表项(就像每次构建都生成新的 GUID 一样)。

当引入新的版本号时,MATLAB Compiler SDK 会生成新的类和接口 GUID,以便系统将它们识别为与以前的版本不同,即使类名相同。因此,一旦您部署了构建的组件,请对组件所做的任何更改使用新的版本号。这可确保您部署新组件后,可以轻松管理两个版本。

MATLAB Compiler SDK 通过查询系统注册表中现有的同名组件来实现特定组件名称、类名和版本号的版本控制规则:

  • 如果现有组件具有相同的版本,则使用现有组件的类型库的 GUID。如果新类的名称与以前的版本匹配,它会重用类和接口 GUID。如果类名不匹配,它会为新类和接口生成新的 GUID。

  • 如果发现具有不同版本的现有组件,它将使用现有的类型库 GUID 并为新版本号创建一个新的子项。它为新的类和接口生成新的 GUID。

  • 如果找不到具有指定名称的现有组件,它会为该组件的类型库、类和接口生成新的 GUID。