Помогите с отладкой ошибок COM? (преобразования файлов .mdi в .pdf с использованием Microsoft Office Document Imaging) - PullRequest
1 голос
/ 10 марта 2010

Мне показалось, что у меня есть рабочее решение для преобразования файлов .mdi в PDF с использованием объектной модели визуализации документов Microsoft Office. Решение находится в службе Windows, но теперь я сталкиваюсь с некоторыми ошибками, из-за которых у меня возникают проблемы с поиском информации.

Исключение, которое я получаю:

Сервер выдал исключение. (Исключение из HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) System.Runtime.InteropServices.COMException (0x80010105): сервер бросил исключение. (Исключение из HRESULT: 0x80010105 (RPC_E_SERVERFAULT))
в MODI.DocumentClass.Create (String FileOpen) at DocumentStore.Mdi2PDF (String path, String newPath)

Затем в средстве просмотра событий возникает следующая ошибка приложения:

Неисправное приложение MyWindowsServiceName.exe, версия 1.0.0.0, отметка времени 0x4b97f185, неисправный модуль mso.dll, версия 12.0.6425.1000, отметка времени 0x49d65443, код исключения 0xc0000005, ошибка смещение 0x0000bd8e, идентификатор процесса 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, но только созданием экземпляра внутри Сервиса? Не совсем имеет смысла.

У кого-нибудь есть какие-либо подсказки об этих ошибках и о том, как их отлаживать дальше?

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Здесь есть кое-что интересное о закрытии COMObject после его использования или что-то в этом роде. Возможно, это может помочь, я надеюсь, что это так.

  1. COMException 0x80010105
  2. Исключение из HRESULT: 0x80010105 (RPC_E_SERVERFAULT))

Кажется, что-то связано с удалением объектов, либо объектов, расположенных слишком рано, либо не расположенных вообще.

Пытались ли вы когда-нибудь время от времени вызывать сборщик мусора на протяжении всего времени обращения к методам COM-объекта?

Я не знаю, я подбрасываю все, что приходит мне в голову, возможно, это когда-нибудь закончится как решение! =)

1 голос
/ 11 марта 2010

разбился. Это мертвый попугай. Аппаратное исключение AccessViolation в библиотеке DLL (mso.dll). У вас есть несколько вариантов, чтобы выяснить, почему именно это произошло, это не ваш код. Но использование многопоточности - , безусловно, - хороший способ аварийного завершения однопоточного COM-сервера. Подойдет любой код Office. Сначала избавьтесь от потоков, затем обратитесь в службу поддержки Microsoft.

...