После обновления 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, а также удаление и перекомпоновку временных файлов. Я также попытался обновить контрольную сумму библиотеки типов приложения хоста, которая должна иметь тот же эффект. Однако ни одно из этих исправлений, похоже, не работает, и у меня заканчиваются идеи.