regsvr32 filename.ax实际上做了什么?
它基本上调用你的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-audio-input-open-source/blob/master/acam/virt_audio_all.cpp#L631
。
regsvr32将DLL和EXE注册到Windows注册表中(通常是COM类型库,类ID,接口ID等)。您可以使用regedit来导航注册表。
但它是如何工作的?它有什么样的影响? – wamp 2010-08-13 09:16:10
COM即在Windows中广泛使用依赖注册。一个组件将提供类型库,接口和类。其中每个都由一个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组件提供安装程序要好得多,它可以在组件已被删除的情况下进行修复和卸载。您还可以在不同版本中创建相同组件的并行安装。
非常高质量的答案,谢谢 – AFract 2016-08-30 09:21:29
这两个github链接都不再起作用 - 你能够编辑你的答案中的例子吗? – codingbadger 2011-11-12 09:57:48
对此表示遗憾 – rogerdpack 2011-11-22 14:12:40