Regsvr32的奇怪行为 => Regsvr32没有给出任何成功或失败的消息

7
我有一个DirectShow过滤器:MyFilter.ax
当我试图使用Regsvr32实用程序注册MyFilter.ax时,它没有显示任何错误或消息(成功或失败)。但是该过滤器未被注册。
Regsvr32实用程序对我的其他过滤器有效。
为什么Regsvr32没有给出任何成功或失败消息?如何调试Regsvr32的失败和成功?是否有其他可用于注册DirectShow过滤器并提供有意义消息的实用程序?
最好的祝愿
更新:
我在虚拟机上安装了干净的Win7操作系统。然后尝试注册。再次失败,而Regsvr32没有响应任何消息。
但是,随后在虚拟机上再次安装了干净的Win7操作系统。然后进行所有更新。更新后,Regsvr32起作用并安装了我的过滤器....我不知道是什么原因导致Regsvr32失败,以及哪种更新修复了它。或者这真的是一个更新问题吗?
4个回答

3

可能发生并表现出上述行为的原因是,在您的过滤器中某处存在死循环或无限等待,因此DLL的DllRegisterServer从未返回。在这种情况下,每次尝试使用regsvr32时,您将能够看到Task Manager显示一个以上的regsvr32.exe运行进程,具有或不具有CPU消耗。

如果您遇到了这种情况,您需要使用调试器连接并查看您在哪里有死循环...


1
我解决了。看起来ActiveX无法找到第三方DLL...但是,regsvr32进入无效状态而不是优雅地报错。调试没有提供有价值的信息。 - Novalis

2

请确保您不使用/s选项调用regsvr32。


1
不要使用静默模式 /s 调用 regsvr32。只需使用 regsvr32 MyFilter.ax。 - Novalis

1

你可以像 regsvr32 一样自己实现一个应用程序,只需要加载目标 dll 并调用函数 DllRegisterServer。例如,你可以使用以下 p/invoke 声明在 C# 中实现它:

[DllImport("yourdll.ax")]
private static extern int DllRegisterServer();

你可以通过这种方式缩小问题范围。

更新:

我建议尝试安装Windows 7平台SDK,并针对该SDK编译您的DirectShow过滤器。我曾经在Windows 7中遇到过旧版本DirectX的兼容性问题(甚至缺少dll文件),尽管我没有保留参考资料(如果有人阅读此文并有参考资料,请发布出来)。


我缩小了问题范围。使用Dependency Walker调试regsvr32。但是没有有意义的日志...它只会得到通用的访问冲突错误...我的ActiveX DLL在某些机器上以某种无效状态进入,但并非所有机器都如此。我在Windows 7上进行了测试。 - Novalis
1
也许您正在尝试在64位操作系统中注册32位dll?如果是这种情况,那么您需要使用c:\ windows \ syswow64 \ regsvr32.exe而不是c:\ windows \ system32 \ regsvr32.exe。 - yms
或者您可能缺少依赖库,例如vc-redist。您创建了这个.ax文件吗? - yms
我创建了这个过滤器文件。似乎没有缺少的库。如果有,regsvr32会告诉我。而且我在32位操作系统上使用它。但我发现其他奇怪的事情。我在虚拟机上安装了一个干净的win7操作系统。然后尝试注册。它也失败了,没有任何来自regsvr32的消息。但是当我重新安装操作系统并进行所有更新后,它就可以工作了...如果有缺失的更新(如果有),会导致regsvr32和我的过滤器失败? - Novalis

1

我也遇到了这个问题,以下是我找出问题的方法:

将您的dll设置为启动项目。
进入配置属性 -> 调试:将命令设置为c:\windows\syswow64\regsvr32.exe(如果您在32位系统上,则为32位版本c:\windows\system32\regsvr32.exe
将命令参数设置为您的dll的完整路径
以调试模式运行,您应该会看到弹出窗口,显示您的dll已正确注册,然后执行将挂起。
单击以暂停执行
在线程调试窗口中检查当前活动的线程。 检查它们的调用堆栈,因为大多数线程(在我的情况下)都卡在ntdll.dll中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接