Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE) Workarounds

14 浏览
0 Comments

Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE) Workarounds

我在以下调用中遇到了问题:

Marshal.GetActiveObject("Excel.Application")

我收到了以下错误信息:

操作不可用(来自HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)的异常)

我相信这个错误是由于我的应用程序和Excel之间的用户权限不匹配所致。

我想知道是否有一种解决方法,可以无论如何打开Excel,都可以访问已打开的Excel应用程序。我可以以管理员身份打开要访问Excel的程序。

另外,我想知道如何判断打开的进程的权限是什么?我一直在使用ProcessExplorer来查看UserProfile(两个应用程序中相同),以及Owner(也是相同的BUILTIN\Administrators)。

背景

我有一个通过调用NUnit-console-x86运行不同测试的程序。正在被测试的应用程序会打开一个Excel表单,我想从中读取数据。无论我以管理员身份运行还是不以管理员身份运行,都会出现这些错误。我还尝试在启动NUnit的程序中添加Process.StartInfo.Verb = "runas";,但仍然出现这些错误。

似乎安装Visual Studio可以解决这个问题,尽管我不想在每台计算机上都安装Visual Studio。

有人能向我解释其中的任何问题吗?

0
0 Comments

问题出现的原因:在某些情况下,调用Excel应用程序时可能会出现异常。这可能是由于Excel应用程序未正确启动或未注册所致。

解决方法:

1. 方法一:在调用Excel应用程序之前,先启动Excel。可以使用以下代码启动Excel,并根据需要进行调整:

   string pathToTheVersionOfExcel = @"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE";
   System.Diagnostics.Process.Start(pathToTheVersionOfExcel);
   Thread.Sleep(5000);
   

2. 方法二:使用不同的方式调用Excel应用程序。可以使用以下代码:

   var oExcelApp = new Microsoft.Office.Interop.Excel.Application();
   

3. 方法三:使用一个绕过方法。可以使用以下代码:

   [DllImport("user32.dll")]
   private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
   //在方法中...
   string pathToTheVersionOfExcel = @"C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE";
   Application oExcelApp = null;
   Process process = new Process();
   process.StartInfo.FileName = pathToTheVersionOfExcel;
   process.Start();
   Thread.Sleep(5000);
   //打开和关闭记事本似乎可以"注册"Excel 2016,但对于Excel 2010则不需要...
   Process processNotepad = new Process();
   processNotepad.StartInfo.FileName = @"C:\Windows\system32\notepad.exe";
   processNotepad.Start();
   ShowWindow(process.MainWindowHandle, 2); //最小化
   ShowWindow(process.MainWindowHandle, 3); //最大化
   Thread.Sleep(5000);
   processNotepad.CloseMainWindow();
   oExcelApp = (_Application)Marshal.GetActiveObject("Excel.Application");
   

如果在RDP会话中运行此代码且使用Excel 2016,则可能会非常挑剔。需要自定义RDP以忽略其最小化状态。可以参考此篇文章获取帮助。

如果尝试通过某种自动化的构建/发布平台在远程服务器上调用Excel(例如TFS/Azure DevOps),则需要尝试使用autologin。目前我还没有成功实现这个功能。

0
0 Comments

文章标题:解决Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)的问题

根据微软支持信息,当Excel(或Office)未处于活动状态或未在Running Object Table中运行时,会生成0x800401e3错误。在调用之前,必须打开Excel的副本。可能是因为您尚未在代码中打开Excel,或者Excel尚未完全注册。这可能是问题的原因。

不,Excel是在运行的。但是我以非管理员身份运行了Visual Studio。当我以管理员身份重新运行时,一切开始正常工作。

啊,是的,这也可能是原因。很高兴你能解决问题。

根据您提供的文章链接:“当Office应用程序启动时,它不会立即注册其正在运行的对象。这优化了应用程序的启动过程。 Office应用程序在失去焦点后将其正在运行的对象注册到ROT中。” 我发现您需要将焦点放在其他窗口上才能实现这一点(只是最小化也可以...),这有点不太正规,不知道是否有更好的方法。

这对我来说行得通,老实说,它应该是一个独立的答案。但作为解决方案来说,这也太不正经了。

0
0 Comments

问题出现的原因是Visual Studio和Excel之间权限不匹配。微软的文档没有明确说明这一点,但实际上是这样的。更严重的问题是,旧版本的Excel(如2007版)不知道管理员权限,因此有时会抛出异常,有时则不会。

当出现这个问题时,你应该将权限设置为管理员-管理员或无-无。即使Excel设置为无权限,Visual Studio设置为管理员权限也可能不起作用。

解决方法:

1. 将Visual Studio和Excel的权限设置为相同,都设置为管理员权限或都设置为无权限。

2. 如果将Excel设置为无权限,将Visual Studio设置为管理员权限仍然无效,可以尝试以下解决方法:

- 确保你的项目中的Excel引用是正确的,并且与你的Excel版本相匹配。

- 确保你的项目中正确地引用了Microsoft.Office.Interop.Excel命名空间。

- 确保你的Excel安装正确,并且没有损坏或缺失的文件。

- 尝试重新安装Excel并更新到最新版本。

- 在解决方案资源管理器中,右键单击你的项目,选择“属性”。

- 在属性窗口中,选择“生成”选项卡。

- 将“目标平台”设置为与你的Excel版本相匹配的平台(如x86或x64)。

- 重新编译并运行你的项目,看看问题是否解决。

希望以上方法能够解决你遇到的问题。如果问题仍然存在,请尝试在相关的开发者社区或论坛上寻求帮助,以获取更详细的解决方案。

0