首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)的异常

来自HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)的异常
EN

Stack Overflow用户
提问于 2015-04-28 21:02:06
回答 3查看 7K关注 0票数 4

使用.Net 4.0 / WPF应用程序/ C#

我的应用程序中有下面的代码,它在单击FileDialog按钮时打开一个Select

代码语言:javascript
运行
复制
OpenFileDialog fdgSelectFile;
bool? dialogResult;

try
{
    fdgSelectFile = new OpenFileDialog {DefaultExt = FileDialogDefaultExt, Filter = FileDialogFilter};
    dialogResult = fdgSelectFile.ShowDialog();
    if (dialogResult.HasValue && dialogResult.Value)
    {
        SelectedFilePath = fdgSelectFile.FileName;
        // do your stuff
    }
}

这段代码在其他机器上工作,但在我的机器中不起作用。当单击Select按钮时,它只抛出一个异常(如下所示)。

代码语言:javascript
运行
复制
2015-04-28 14:33:47,453 [1] ERROR XXXX.XXXX.XXXX.ViewModels.UploadViewModel - SelectFile - System.Runtime.InteropServices.COMException (0x80040111): Creating an instance of the COM component with CLSID {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7} from the IClassFactory failed due to the following error: 80040111 ClassFactory cannot supply requested class (Exception from HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)).
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at Microsoft.Win32.OpenFileDialog.CreateVistaDialog()
   at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner)
   at Microsoft.Win32.FileDialog.RunDialog(IntPtr hwndOwner)
   at Microsoft.Win32.CommonDialog.ShowDialog()
   at XXXX.XXXX.XXXX.ViewModels.UploadViewModel.SelectFile(Object param) in c:\XXXX\XXXX\Client\XXXX.XXXX.XXXX\ViewModels\UploadViewModel .cs:line 176

发现错误是由comdlg32.dllMicrosoft.Win32命名空间引起的,在PresentationFramework.dll程序集中,我向注册表查询这个CLS

代码语言:javascript
运行
复制
reg query HKCR\CLSID | find /i "{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}"

下面是上面写的

HKEY_CLASSES_ROOT\CLSID{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}

我还尝试了以下几种方法

  1. 根据this所以Post,我试着注册dll,但是它回来说 窗口标题RegSvr32 加载了模块"comdlg32.dll“,但没有找到入口点DllRegisterServer。 确保"comdlg32.dll“是一个有效的DLL或OCX文件,然后再试一次。 好的
  2. 根据this所以Post,我试着改变Permissions,但没有运气

除了对机器进行重新成像或重新安装Windows之外,还有什么办法可以解决这个问题吗?

如果这有帮助的话:我在我的机器上安装了.Net FrameWork v3.5/ v4.0 / v4.5.1 & v4.5.2,并且在文件夹中的所有位置都可以使用PresentationFramework.dll

代码语言:javascript
运行
复制
v3.5   : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client
v4.0   : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0
v4.5   : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5
v4.5.1 : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1
v4.5.2 : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2
EN

回答 3

Stack Overflow用户

发布于 2015-12-13 00:09:47

抛开Windows安装被破坏的可能性,这实际上是一个相当阴险的问题,它是由Windows 7和更高版本中关闭的“视觉主题”引起的。

要复制它,您可以使用一个工作的WPF应用程序并修改它的兼容性设置(单击Windows中的.exe,然后选择Preferences,然后从Compatibiltiy选项卡中,选中“禁用视觉主题”)。然后,尝试运行应用程序,当您试图显示OpenFileDialog或SaveFileDialog时,您会注意到它开始崩溃。

可视主题也可以在操作系统级别关闭(例如,在使用高对比度主题时),并且它们通常在终端服务会话中关闭,或者在通过WebEx或其他桌面共享应用程序共享桌面时关闭。

不幸的是,我还没有一个解决方案,但基于阅读MSDN,它似乎是说,您应该“提供一个替代的代码路径”时,桌面组合和视觉主题是关闭-无论这意味着什么。

在内部,OpenFileDialog的实现有一个方法尝试初始化打开的文件对话框COM控件的实例,该控件在Visual关闭时失败

代码语言:javascript
运行
复制
[SecurityCritical, SecurityTreatAsSafe]
internal override IFileDialog CreateVistaDialog()
{
    new SecurityPermission(PermissionState.Unrestricted).Assert();
    return (IFileDialog) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")));
}
票数 5
EN

Stack Overflow用户

发布于 2018-11-05 11:08:23

在使用SaveFileDialog时,我也遇到了同样的问题。

确保使用System.Windows.Forms.SaveFileDialog而不是 Microsoft.Win32.SaveFileDialog

票数 1
EN

Stack Overflow用户

发布于 2019-11-22 12:08:08

关于使用System.Windows.Forms.SaveFileDialog的答案的说明;请确保设置属性AutoUpgradeEnabled = False

在Windows 10中有一个高对比度模式,如果用户开着它,并且您没有设置这个选项,您将得到这个错误。

警告:该控件看起来像Windows中的一些东西,但至少它仍然能工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29929862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档