gpt4 book ai didi

exception - Word Automation InvalidCastException RPC/COM 异常

转载 作者:行者123 更新时间:2023-12-02 17:56:07 25 4
gpt4 key购买 nike

我正在开发文字自动化应用程序,但遇到了意外的 RPC/COM 转换异常的严重问题

[System.InvalidCastException: Nie można rzutować obiektu modelu COM typu 'System.__ComObject' na typ interfejsu 'Microsoft.Office.Interop.Word._Application'. Ta operacja nie powiodła się, ponieważ wywołanie metody QueryInterface dla składnika modelu COM w celu uzyskania interfejsu o identyfikatorze IID '{00020970-0000-0000-C000-000000000046}' nie powiodło się z powodu następującego błędu: Serwer RPC jest niedostępny. (Wyjątek od HRESULT: 0x800706BA).]

从波兰语翻译成英语:

Unable to cast System.__ComObject to Microsoft.Office.Interop.Word._Application. The reason is that QueryInterface for IID '{00020970-0000-0000-C000-000000000046}' failed - RPC server is unavailable - error code HRESULT: 0x800706BA

这里是wordapp模块的简介:

初始化 - 用户登录后。

using Microsoft.Office.Interop.Word;

public class WordApp
{
Application app = null;
object m = System.Reflection.Missing.Value;
object oFalse = false;
object oTrue = true;

...

            app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application.12")) as Application;
app.Visible = false;
app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
app.PrintPreview = false;

我使用 Activator.CreateInstance 而不是 app = new Application() - 这里是 explanation .

然后用户可以在 wordapp 模块中执行 2 个操作

a) 打印准备好的 docx 文档

        System.Windows.Forms.PrintDialog pd = new System.Windows.Forms.PrintDialog();
...

this.app.ActivePrinter = pd.PrinterSettings.PrinterName;
object oNumcopies = pd.PrinterSettings.Copies;
object oRange = WdPrintOutRange.wdPrintAllDocument;
object inputname = fullPath;
Document doc = app.Documents.Add(
ref inputname,
ref m,
ref m,
ref m);
try
{
// Print the document
doc.PrintOut(ref oFalse, ref oFalse, ref oRange,
ref m, ref m, ref m,
ref m, ref oNumcopies, ref m, ref m,
ref oFalse, ref m, ref m,
ref m, ref m, ref m, ref m,
ref m);
}
finally
{
doc.Close(ref oFalse, ref m, ref m);
doc = null;
}

b) 将 docx 转换为 mht

        object inputname = docxname;
object outputname = htmlname;
object fileType = WdSaveFormat.wdFormatWebArchive;

Document doc = app.Documents.Add(
ref inputname,
ref m,
ref m,
ref m);
try
{
doc.SaveAs(ref outputname, ref fileType,
ref m, ref m, ref m, ref m, ref m, ref m, ref m,
ref m, ref m, ref m, ref m, ref m, ref m, ref m);
}
finally
{
doc.Close(ref oFalse, ref m, ref m);
doc = null;
}

当用户注销时,我释放word实例:

            object oSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
app.Quit(
ref oSaveChanges,
ref m,
ref m);

异常在随机位置抛出 - 但最常见的位置是 app.Documents.Add 附近。发生该异常后,将无法执行 app.Quit。看来单词实例已经死了。

我在事件日志(应用程序范围)中发现了这个东西:

EventType offdiag12, P1 585d8a02-f370-4c04-85b6-fccad7e80459255ec053-6dbd-4a22-9e59-112a79de8c6a, P2 NIL, P3 NIL, P4 NIL, P5 NIL, P6 NIL, P7 NIL, P8 NIL, P9 NIL, P10 NIL.

我运行 Office 诊断,没有发现任何错误。

是否可以启用/从系统中查找更多错误信息?

这段代码在我的开发机器(vista)上运行得很好。该问题发生在客户计算机上(通常是 winxp sp2/sp3)。

我的代码有错误吗?

我唯一需要补充的一件事。WordModule init/close/print 函数从主线程调用,并从后台工作线程的 savetomht 调用。

最佳答案

您所描述的情况往往是指以下情况。您使用 COM 进程外服务器(在单独的进程中实例化的 COM 对象,而不是在与程序相同的进程中实例化的 COM 对象),并且由于某种原因,COM 服务器遇到 fatal error 并意外终止。您使用的 COM 对象不再存在。由于 RPC 用于与进程外 COM 服务器交互,并且服务器端在终止后不再存在,因此您会收到错误消息,指出 RPC 服务器不可用,这是事实,但看起来令人困惑。

您必须研究并排除COM服务器终止的原因。最可能的原因如下:

  • 传递给调用的一些不合理的输入值
  • 事件处理程序中未处理的异常。如果您对 COM 组件触发的事件有任何处理,您应该捕获可能在处理程序内部引发的所有异常,并且不要让它们传播到处理程序之外。

关于exception - Word Automation InvalidCastException RPC/COM 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com