14
regsvr32 filename.ax

我只是看到它说安装成功,但整个故事是什么?

4

3 回答 3

31

在 Windows 中广泛使用的COM依赖于注册。组件将提供类型库、接口和类。其中每一个都由一个 GUID 定义以唯一命名它们。COM 组件还可以定义 ProgID,它们是笨拙的 GUID 的一种快捷方式。

所有这些信息都存储在名为HKEY_CLASSES_ROOT. 用于RegEdit.exe查看。特别是,您可以在 中找到类型库、在 中找到HKEY_CLASSES_ROOT\TypeLib接口HKEY_CLASSES_ROOT\Interface和在 中找到类HKEY_CLASSES_ROOT\CLSID。注册表中的一些信息将包含组件的实际 DLL 的路径,允许 Windows 在请求时定位并加载组件。

当您安装 COM 组件时,必须创建正确的注册表信息。按照惯例,DLL 可以提供两个导出函数:

当您执行可执行文件时RegSvr32.exe MyComponent.dllRegSvr32.exe将尝试调用DllRegisterServer. MyComponent.dll然后,DLL 应该创建所有必要的注册表项以允许使用该组件。

以类似的方式,您可以使用RegSvr32.exe /u MyComponent.dll取消注册组件。这将删除以前添加到注册表的所有信息。

Windows 严重依赖 COM,并且 COM 注册是最新的非常重要。不幸的是,没有什么可以阻止您删除已注册的 COM 组件。这将在注册表中留下指向不再存在的 DLL 的悬空指针。您甚至无法取消注册它,因为它不再存在。

另一个问题是当两个不同的应用程序需要相同组件的不同版本时。注册表只能指向两个版本之一,这可能会导致其中一个应用程序失败。

Microsoft 已针对这些问题创建了修复程序。最好为 COM 组件提供一个安装程序,如果该组件已被删除,则该安装程序能够修复和卸载该组件。您还可以在不同版本中创建相同组件的并行安装。

于 2010-08-13T09:30:51.273 回答
2

它基本上调用您的 dll(在本例中名为 filename.ax)并调用其“DllRegisterServer”方法。

对于directshow 过滤器,它可能会在Windows 注册表中“注册”这些过滤器,以便directshow 知道它们。

例如:https ://github.com/rdp/directshow-demo-audio-input-open-source/blob/master/acam/virt_audio_all.cpp#L698调用 https://github.com/rdp/directshow-demo-音频输入开源/blob/master/acam/virt_audio_all.cpp#L631

虽然那里有更简单的版本。

于 2010-08-17T16:07:22.777 回答
0

regsvr32 将 DLL 和 EXE 注册到 Windows 注册表(通常是 COM 类型库、类 ID、接口 ID 等)。您可以使用 regedit 导航注册表。

于 2010-08-13T08:13:05.763 回答