C# 打开“获取目录”对话框时COM类工厂错误80040154

C# 打开“获取目录”对话框时COM类工厂错误80040154,c#,.net,windows,C#,.net,Windows,我知道这个问题的常见原因与编译组件的平台有关,我过去也遇到过这个问题。但是,这是一个来自单个用户的报告,并且在用户尝试打开对话框以选择文件或目录时发生。我这里没有使用任何花哨的组件,只是使用标准组件。其中一个堆栈跟踪中的相关行为: 正在检索具有CLSID的组件的COM类工厂 {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}由于以下原因失败 错误:80040154。在 System.Windows.Forms.OpenFileDialog.CreateVistaDial

我知道这个问题的常见原因与编译组件的平台有关,我过去也遇到过这个问题。但是,这是一个来自单个用户的报告,并且在用户尝试打开对话框以选择文件或目录时发生。我这里没有使用任何花哨的组件,只是使用标准组件。其中一个堆栈跟踪中的相关行为:

正在检索具有CLSID的组件的COM类工厂 {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}由于以下原因失败 错误:80040154。在 System.Windows.Forms.OpenFileDialog.CreateVistaDialog()位于 System.Windows.Forms.FileDialog.RunDialogVista(IntPtr hWndOwner)位于 System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)位于 System.Windows.Forms.CommonDialog.ShowDialog(iwin32窗口所有者)位于 System.Windows.Forms.CommonDialog.ShowDialog()位于 ScruffyDuck.AirportDesignEditor.MainForm.getOpenFileInfo(字符串 初始目录,字符串筛选器)

我在注册表中搜索了这个CLSID,找到了

%SystemRoot%\System32\comdlg32.dll

我想这并不奇怪。我假设,因为有许多其他用户没有这个问题,这必须与用户设置有关。如果你能给他一些建议,我将不胜感激


非常感谢

我现在只是猜测,因为这不是编程问题,所以如果我不帮忙,请不要-1我,只是提供一些想法…:P

这里的问题是,系统无法使COM对象脱离该CLSID指定的COM类。发生这种情况的原因有很多:

  • comdlg32.dll
    未注册,请尝试将其注册到
    regsvr32 comdlg32.dll
  • 系统帐户对保存CLSID的注册表项没有完全控制(权限){DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}。您可以通过导航(或搜索注册表)到该项,右键单击该项,然后选择
    权限…
    给予系统帐户对该项的完全控制来检查
  • 对于管理员帐户,也可以尝试上述方法
  • comdlg32.dll
    已损坏。如果间谍软件或其他恶意程序试图将自己挂接到打开的文件或浏览目录对话框,并因此修改了库,则可能发生这种情况。。。在这种情况下,您必须重新安装库。。。或者窗户。要检查lib是否正常,请对其进行MD5哈希,并与工作系统上lib的MD5哈希进行比较。它们应该是相同的

嗯,希望我能帮忙。:)

您的应用程序是否在
MTAThread
中运行?查找
main()
方法,然后查看它的属性,应该是
[MTAThread]
或者
[STAThread]
。它一直在[STAThread]中,我们以前从未见过。据我所知,大约30000个用户中只有一个用户报告了此问题。regsvr32不起作用,因为comdlg32.dll不导出DllRegisterServer(它是操作系统的一部分,永远不需要独立安装)。我同意这不是一个很大的编程问题,可能是操作系统安装损坏或是某个坏的第三方。如果没有其他办法,我会尝试修复Windows。@eran当然这不是我的系统。如果用户在我的应用程序中对此有问题,那么其他应用程序中也会出现问题,这是否正确?@cipi非常感谢,这很有帮助。我正在等待用户回复我的电子邮件,因为这来自自动日志上传。很可能是他的系统被破坏了。@ScruffyDuck,我不能肯定,但我希望那个用户会有各种各样的问题,不仅仅是在使用你的应用程序时。@eran-我可以相信-他没有回复我的电子邮件,所以我现在就把它停下来,直到他回复为止。谢谢你的帮助