regsvr32 filename.ax
我只是看到它说安装成功,但整个故事是什么?
在 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.dll
,RegSvr32.exe
将尝试调用DllRegisterServer
. MyComponent.dll
然后,DLL 应该创建所有必要的注册表项以允许使用该组件。
以类似的方式,您可以使用RegSvr32.exe /u MyComponent.dll
取消注册组件。这将删除以前添加到注册表的所有信息。
Windows 严重依赖 COM,并且 COM 注册是最新的非常重要。不幸的是,没有什么可以阻止您删除已注册的 COM 组件。这将在注册表中留下指向不再存在的 DLL 的悬空指针。您甚至无法取消注册它,因为它不再存在。
另一个问题是当两个不同的应用程序需要相同组件的不同版本时。注册表只能指向两个版本之一,这可能会导致其中一个应用程序失败。
Microsoft 已针对这些问题创建了修复程序。最好为 COM 组件提供一个安装程序,如果该组件已被删除,则该安装程序能够修复和卸载该组件。您还可以在不同版本中创建相同组件的并行安装。
它基本上调用您的 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
虽然那里有更简单的版本。
regsvr32 将 DLL 和 EXE 注册到 Windows 注册表(通常是 COM 类型库、类 ID、接口 ID 等)。您可以使用 regedit 导航注册表。