После обновления Microsoft Office 2007 до Office 2010 некоторые пользовательские скрипты VBA, встроенные в наше программное обеспечение, не удалось скомпилировать со следующим сообщением об ошибке:
Библиотека объектов недействительна или содержит ссылки на определения объектов, которые не удалось найти.
Насколько я знаю, эта ошибка является результатом обновления безопасности от Microsoft (Microsoft Security Advisory 960715). При добавлении элементов управления ActiveX к сценариям VBA информация об элементах управления хранится в файлах кеша на локальном жестком диске (.exd файлы). Обновление безопасности изменило некоторые из этих элементов управления, но .exd файлы не были автоматически обновлены. Когда скрипты VBA пытаются загрузить старые версии элементов управления, хранящихся в кэшированных файлах, возникает ошибка. Эти кеш файлы должны быть удалены с жесткого диска, чтобы элементы управления могли загружаться успешно (что автоматически создаст новые, обновленные .exd файлы).
То, что я хотел бы сделать, это программно (с помощью Visual С++) удалить устаревшие .exd файлы при загрузке нашего программного обеспечения. При открытии проекта VBA с использованием CApcProject::ApcProject.Open
я устанавливаю следующий флаг: axProjectThrowAwayCompiledState
.
TestHR(ApcProject.Open(pHost, (MSAPC::AxProjectFlag) (MSAPC::axProjectNormal | MSAPC::axProjectThrowAwayCompiledState)));
В соответствии с документацией этот флаг должен перекомпилировать проект VBA и временные файлы, которые необходимо удалить и перестроить. Я также попытался обновить контрольную сумму библиотеки типов приложений хоста, которая должна иметь тот же эффект. Однако ни один из этих исправлений, похоже, не выполняет эту работу, и у меня заканчиваются идеи.