В Visio Addin метод API Application.Documents.OpenEx () генерирует исключение после открытия нескольких файлов (один за другим, а не параллельно). - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь открыть некоторые файлы (между 50-400) программным способом с помощью надстройки в orde для их редактирования. Я делаю это последовательно, открываю, редактирую, закрываю и т. Д.

Иногда при непредвиденном поведении метод OpenEx () генерирует исключение system.accessviolation и остановка программы, я не могу очиститьфайл, который программа пытается открыть и не может отменить запрос на открытие и переход.

Я могу поймать исключение, но как только это происходит с конкретным файлом, то при попытке открыть все следующие файлы выдаетисключение. Я хотел бы спросить: 1. Почему это иногда происходит непоследовательно? 2. Есть ли способ отменить запрос на открытие файла? Нужно ли очищать память? Что мне нужно сделать, чтобы я мог открывать файлы после того, как это произошло с каким-то файлом?

Это основной код:

Globals.ThisAddIn.Application.Documents.OpenEx(currVisioFile,(int)Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenRW);

1 Ответ

0 голосов
/ 17 октября 2019

Если открытие большого количества файлов из самой надстройки Visio является или становится нестабильным (проблема, с которой я также сталкивался), я рекомендую открывать и закрывать новый экземпляр Visio для каждого имеющегося у вас документа.

Один из способов сделать это, например, в Python - установить пакет pypiwin32 и запустить следующий скрипт:

import win32com.client

documentsToProcess = ["path/to/doc1", "path/to/doc2", "path/to/doc3"]

for path in documentsToProcess:
    app = win32com.client.DispatchEx("Visio.Application") # Open new Visio instance
    doc = app.Documents.Open(path) # Open your document (and hopefully blocks)
    doc.Saved = true # For quiet exit
    app.Quit()

Вы можете найти всю официальную документацию о функции Open и всех других объектах. и методы здесь .

Затем вы изменили бы свой код надстройки так, чтобы он просто ожидал открытия документа перед его обработкой, например:

private void ThisAddIn_Startup(object sender, System.EventArgs e) {
    // We subscribe to the DocumentOpened/Created event
    this.Application.DocumentOpened += Application_DocumentOpened;
}

private void Application_DocumentOpened(Document doc) {
    // Process your document here.
    // Do your work on your document here!
}

Обычно работа, которую вы должны выполнять над каждым документом, намного дольше, чем просто создание нового экземпляра Visio, поэтому это не должно вызывать проблем.

Возможно, вам нужно внести несколько изменений, чтобы гарантировать, чтоЭкземпляр Visio закрывается правильно, но это идея. Вы также можете принудительно убить процесс, если это необходимо, когда он застрянет.

...