Проблемы OLE и их решения в Delphi-программах для документов Office
В статье рассматривается проблема, связанная с использованием компонентов OLE в Delphi-программах для работы с документами Office. Проблема заключается в том, что при попытке активации OLE-объекта через вызов метода DoVerb(ovInPlaceActivate) возникают различные ошибки, такие как (0x80030002) %1 could not be found., (0x80030005) Access Denied. и (0x800706BE) The remote procedure call failed.. Это происходит на компьютере клиента, в то время как на компьютере разработчика все работает корректно.
Пример кода, вызывающего проблему
procedure THKSOleContainer.SaveOleObject(AFileName: String = '');
var
LActivatedBefore: Boolean;
begin
LActivatedBefore := GetIsActivated;
DoVerb(ovInPlaceActivate, False); // Вызов активации OLE-объекта
// ... далее следует сохранение объекта
end;
Объяснение кода
Класс THKSOleContainer переопределяет метод SaveToStream, который сохраняет содержимое OLE-контейнера во временный файл, а затем считывает его обратно в TFileStream. Это делается для получения нативного документа в виде потока данных. Форма TfrmOleOffice отображает экземпляр THKSOleContainer.
Анализ работы кода
На компьютере разработчика и при загрузке документа без его редактирования и последующей активации код работает корректно. Однако, после редактирования и попытки сохранения документа на компьютере клиента происходит сбой.
Возможные причины и решения
Влияние антивирусной программы
Предположение о том, что проблема может быть связана с антивирусной программой, было проверено путем временного отключения антивируса. Однако, это не привело к устранению проблемы.
Отключение вызова FOleContainer.Close
После комментирования вызова FOleContainer.Close в функции TfrmOleOffice.SaveToStream, проблема сохранения на стороне клиента была решена.
Влияние COM-добавок Excel
Дополнительно было обнаружено, что COM-добавка Excel для Microsoft Dynamics NAV также могла быть причиной проблем. После ее отключения ошибки при загрузке документов больше не возникали.
Рекомендации
При работе с OLE-объектами в Delphi-программах для документов Office следует тщательно обращаться с состоянием OLE-контейнера, особенно при его закрытии. Также рекомендуется проверять, не вызывают ли сторонние приложения или COM-добавки конфликтов при работе с OLE-объектами.
Заключение
Проблемы, связанные с OLE в Delphi-программах, могут быть вызваны различными факторами, включая состояние OLE-контейнера и сторонние приложения. Важно тщательно анализировать поведение программы в различных условиях и не игнорировать потенциальные конфликты, которые могут возникнуть на разных компьютерах пользователей.
В статье рассматриваются проблемы, связанные с использованием компонентов OLE в Delphi-программах для работы с документами Office, возникающие при активации OLE-объектов и проявляющиеся в ошибках на компьютере клиента, в то время как на компьютере разраб
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.