Office Interop PowerPoint E_NOINTERFACE 注册表错误

Posted

技术标签:

【中文标题】Office Interop PowerPoint E_NOINTERFACE 注册表错误【英文标题】:Office Interop PowerPoint E_NOINTERFACE registry fault 【发布时间】:2015-09-30 20:04:01 【问题描述】:

无法将“System.__ComObject”类型的 COM 对象转换为事件接口类型“Microsoft.Office.Interop.PowerPoint.PresEvents_Event”。此操作失败,因为 IID 为“9826398E-2574-3EDD-9717-A913EE28A41D”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:“不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE) )'并且COM组件不支持IID为'91493463-5A91-11CF-8700-00AA0060263B'的源接口。

我有两个将 PPTX 转换为 pdf 的 smilar 网站。他们使用相同的代码和相同的 dll 进行操作。一个网站用于概念和实验,而另一个用于商业。

实验的一个完美,但另一个有问题。

我使用相同的代码相同的 dll,但它永远不会工作

两个站点在同一个应用程序池上运行。

转换代码是:

var powerpointApp = new Microsoft.Office.Interop.PowerPoint.Application();

var powerpointDocument = powerpointApp.Presentations.Open(@"C:\PowerPoint.pptx", 
                Microsoft.Office.Core.MsoTriState.msoTrue, //ReadOnly
                Microsoft.Office.Core.MsoTriState.msoFalse, //Untitled
                Microsoft.Office.Core.MsoTriState.msoFalse); //Window not visible during converting

powerpointDocument.ExportAsFixedFormat(@"C:\NewPDFFile.pdf", 
                Microsoft.Office.Interop.PowerPoint.PpFixedFormatType.ppFixedFormatTypePDF);

powerpointDocument.Close(); //Close document
powerpointApp.Quit();

堆栈跟踪:

System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, Int32 标志) +0 Microsoft.Office.Interop.PowerPoint.Presentations.Open(字符串 文件名、MsoTriState 只读、MsoTriState 无标题、MsoTriState 有窗)+0 AB.Hybrid.WebSite.Controllers.ViewerController.tryConvert() +157 lambda_method(闭包, ControllerBase, Object[]) +62 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,Object[] 参数)+14 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) +156 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 参数)+27 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22 System.Web.Mvc.Async.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +34 System.Web.Mvc.Async.AsyncInvocationWithFilters.b__3d() +50 System.Web.Mvc.Async.c__DisplayClass46.b__3f() +225 System.Web.Mvc.Async.c__DisplayClass33.b__32(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 System.Web.Mvc.Async.c__DisplayClass2b.b__1c() +26 System.Web.Mvc.Async.c__DisplayClass21.b__1e(IAsyncResult asyncResult) +100 System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult,ExecuteCoreState 内部状态)+13 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +36 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +54 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39 System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult,控制器控制器)+12 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +28 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +54 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.MvcHandler.b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +36 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +54 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果)+9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651796 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

【问题讨论】:

weblog.west-wind.com/posts/2012/Sep/18/… 【参考方案1】:

问题的实际原因是基于互操作 dll。

我将 PowerPoint dll 中的“Embed Interop Types to False”更改为 参考属性

终于成功了

我猜两个或多个项目使用了相同的 dll 并带有嵌入选项,导致发生冲突

windows 上的注册表引用,第二个尝试注册新密钥然后获取

我的错

希望对你有帮助

【讨论】:

以上是关于Office Interop PowerPoint E_NOINTERFACE 注册表错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C#操作幻灯片

PowerPoint 互操作:如果完成速度过快,复制粘贴形状会崩溃

如何使用 C# 2.0 将数据表的内容推送到 powerpoint 幻灯片

Powerpoint Interop 在 Windows 服务中失败,但在 Windows 窗体应用程序中工作正常

无法将“microsoft.Office.Interop.Excel.ApplicationClass”类型的 COM 对象转换为“microsoft.Office.Interop.Excel.App

C# 操作PPt,去掉文本框的边框