как остановить запуск макросов при открытии документа Word с помощью OLE Interop?

#ms-word #office-interop #com-interop

#ms-word #office-interop #com-взаимодействие

Вопрос:

Как следует из названия, у меня есть .Сетевое приложение, которое использует interop для открытия документов в Word. Я установил

app.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable

перед открытием документа. Согласно документации, это «Отключает все макросы во всех файлах, открытых программно, без отображения каких-либо предупреждений системы безопасности»

Однако, когда я пытаюсь открыть один конкретный документ, я получаю на экране диалоговое окно с надписью «не удалось загрузить объект, поскольку он недоступен на этом компьютере». Это документ клиента, но я полагаю, что он содержит макрос со ссылками на COM-объект, который у меня не установлен.

Я делаю что-то глупое? есть ли какой-либо способ фактически отключить макросы при открытии документа Word?

Комментарии:

1. Энди, если на вопрос получен ответ, не могли бы вы, пожалуйста, пометить его как таковой?

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

3. Под вопросом, на который вы отреагировали, размещен ответ. Я узнал об этом из-за аналогичного вопроса, который был задан на прошлой неделе. Было бы неплохо иметь возможность использовать это как «подтвержденный» дубликат, поскольку он содержит так много полезной информации как в Q, так и в A, поэтому я и спросил…

4. Да, согласен, это полезная тема. К сожалению, у меня нет доступа к коду, над которым я работал, и ссылка в ответе не работает 🙁

Ответ №1:

Попробуйте:

WordBasic.Отключите автоматический макрос 1

Как ни странно, это основано на возврате к временам, предшествующим VBA, но по-прежнему кажется наиболее надежным способом гарантировать, что никакие автоматические макросы не запускаются (в любом документе — вы можете включить его обратно, используя параметр «0»).

Недавно у меня был проект, в котором мне пришлось обработать 6000 шаблонов Word (да, шаблонов, а не документов), многие из которых содержали странные элементы, такие как макросы и т.д. Я смог обработать все, кроме 6, используя эту технику. (Я так и не выяснил, в чем проблема с этими 6).


РЕДАКТИРОВАТЬ: обсуждение того, как вызвать это из C #, см.: http://www.dotnet247.com/247reference/msgs/56/281785.aspx

Комментарии:

1. Спасибо, у вас есть какие-нибудь идеи, как я могу вызвать это из C #?

Ответ №2:

Для c # вы можете использовать

(_wordApp.WordBasic as dynamic).DisableAutoMacros();

Весь код, который я использую, является:

 using Word = Microsoft.Office.Interop.Word;
private Word.Application _wordApp;
...
                    _wordApp = new Word.Application
                {
                    Visible = false,
                    ScreenUpdating = false,
                    DisplayAlerts = Word.WdAlertLevel.wdAlertsNone,
                    FileValidation = MsoFileValidationMode.msoFileValidationSkip
                };

                _wordApp.Application.AutomationSecurity = MsoAutomationSecurity.msoAutomationSecurityForceDisable;
                (_wordApp.WordBasic as dynamic).DisableAutoMacros();
  

Комментарии:

1. Вы можете просмотреть эту статью о старом WordBasic learn.microsoft.com/ru-ru/office/vba/api /…