帮助调试 COM 错误? (使用 Microsoft Office Document Imaging 将 .mdi 文件转换为 .pdf 文件)

Posted

技术标签:

【中文标题】帮助调试 COM 错误? (使用 Microsoft Office Document Imaging 将 .mdi 文件转换为 .pdf 文件)【英文标题】:Help with debugging COM errors? (.mdi to .pdf file conversions using Microsoft Office Document Imaging) 【发布时间】:2011-01-26 02:19:11 【问题描述】:

我认为我有一个使用 Microsoft Office Document Imaging 对象模型将 .mdi 文件转换为 PDF 的有效解决方案。解决方案是在 Windows 服务中,但现在我遇到了一些错误,我无法跟踪信息。

我得到的例外是:

服务器抛出异常。 (来自 HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT)) System.Runtime.InteropServices.COMException (0x80010105): 服务器抛出一个 例外。 (HRESULT 的例外情况: 0x80010105 (RPC_E_SERVERFAULT)) 在 MODI.DocumentClass.Create(字符串文件打开) 在 DocumentStore.Mdi2PDF(字符串路径,字符串 newPath)

然后,在事件查看器中有以下应用程序错误:

错误的应用程序 MyWindowsServiceName.exe,版本 1.0.0.0,时间戳 0x4b97f185,故障模块 mso.dll,版本 12.0.6425.1000,时间戳0x49d65443,异常代码0xc0000005,故障 偏移量 0x0000bd8e,进程 ID 0xa5c,应用程序启动时间 0x01cac08cf032914b.

这是进行转换的方法:

private int? Mdi2PDF(String path, String newPath)

    int? pageCount = null;
    string tmpTif = Path.GetTempFileName();

    MODI.Document mdiDoc = new MODI.Document();
    mdiDoc.Create(path);
    mdiDoc.SaveAs(tmpTif,
        MODI.MiFILE_FORMAT.miFILE_FORMAT_TIFF_LOSSLESS,
        MODI.MiCOMP_LEVEL.miCOMP_LEVEL_HIGH);
    mdiDoc.Close(false);

    pageCount = Tiff2PDF(tmpTif, newPath);
    if (File.Exists(tmpTif))
        File.Delete(tmpTif);

    return pageCount;

我从调用它的服务中删除了所有线程,因此只有主线程正在初始化 MODI 对象,但仍然出现错误,因此它似乎与线程无关。

我还构建了一个控制台应用程序,可以转换数百个文档,但没有遇到异常。

那么,这似乎是由于创建了太多 MODI 对象的实例,而只是在 Service 中实例化造成的?完全没有意义。

有人对这些错误以及如何进一步调试有任何线索吗?

【问题讨论】:

您知道哪个 MODI 调用失败了吗?当作为直接控制台应用程序而不是作为服务运行时,您是否会遇到同样的异常? 它在创建调用中(我已经用堆栈跟踪更新了问题)。我将启动并运行控制台应用版本。 【参考方案1】:

这里有一些有趣的事情关于在使用后关闭 COMObject 或类似的东西。这可能会有所帮助,我希望它会。

    COMException 0x80010105 Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))

似乎与处置对象有关,要么是对象处置得太早,要么根本没有处置。

您是否曾尝试在调用 COM 对象方法的过程中不时调用垃圾收集器?

我不知道,我把所有想到的东西都扔了,也许它会在某个地方作为解决方案结束! =)

【讨论】:

谢谢,是的,我同意,我想我已经缩小了处理对象的问题范围,我很欣赏这些建议。我构建了一个控制台应用程序,我同时运行了 2 个版本,创建和关闭了几百个 MDI 对象,没有问题。但是,当我把它放到服务中时,问题又回来了。现在,我将创建 MODI 对象的单个实例并在其上调用 create()、saveas() 和 close()。这似乎已经稳定了它。我也会尝试调用垃圾收集器。【参考方案2】:

它崩溃了。这是一只死鹦鹉。 Office DLL (mso.dll) 中的 AccessViolation 硬件异常。你几乎没有办法弄清楚它究竟为什么会崩溃,这不是你的代码。但是使用线程绝对是使单线程 COM 服务器崩溃的好方法。任何类型的 Office 代码都符合条件。首先摆脱线程,然后致电 Microsoft 支持。

【讨论】:

谢谢,我同意,摆脱线程以进一步隔离任何问题是个好主意。我也一直在尝试将 MODI.Document 实例视为单例,只调用 close() 和 create() 而不是每次都创建一个新实例。

以上是关于帮助调试 COM 错误? (使用 Microsoft Office Document Imaging 将 .mdi 文件转换为 .pdf 文件)的主要内容,如果未能解决你的问题,请参考以下文章

在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsof

需要帮助调试 GWT - Jetty '未知领域'

Servlet的调试

如何通过 devenv.exe\com 构建具有平台配置的项目?

构建内核; WSL2;错误:初始化元素不是常量

启用僵尸对象不足以帮助调试我的问题 - 我还能做啥?