Программно перестраивать .exd-файлы при загрузке VBA - PullRequest
11 голосов
/ 11 июня 2010

После обновления Microsoft Office 2007 до Office 2010 некоторые пользовательские сценарии VBA, встроенные в наше программное обеспечение, не могут быть скомпилированы со следующим сообщением об ошибке:

Библиотека объектов недействительна или содержит ссылки на определения объектов, которые не может быть найден.

Насколько я знаю, эта ошибка является результатом обновления безопасности от Microsoft (Microsoft Security Advisory 960715). При добавлении ActiveX-элементов управления в сценарии VBA информация об элементах управления сохраняется в файлах кэша на локальном жестком диске (.exd-файлы). Обновление безопасности изменило некоторые из этих элементов управления, но .exd-файлы не обновлялись автоматически. Когда сценарии VBA пытаются загрузить старые версии элементов управления, хранящихся в кэшированных файлах, возникает ошибка. Эти кеш-файлы должны быть удалены с жесткого диска для успешной загрузки элементов управления (что автоматически создаст новые, обновленные .exd-файлы).

Что я хотел бы сделать, так это программно (используя Visual C ++) удалить устаревшие .exd-файлы при загрузке нашего программного обеспечения. При открытии проекта VBA с использованием CApcProject::ApcProject.Open я установил следующий флаг: axProjectThrowAwayCompiledState.

TestHR(ApcProject.Open(pHost, (MSAPC::AxProjectFlag) (MSAPC::axProjectNormal | MSAPC::axProjectThrowAwayCompiledState)));

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

1 Ответ

2 голосов
/ 11 июля 2011

Я столкнулся с этой проблемой несколько раз назад, и рекомендуемое (и работающее) решение действительно заключалось в удалении всех файлов .exd на системном диске. Очевидно, они перестраиваются при необходимости, поэтому нет необходимости программно запускать процесс перестройки.

...