Ошибка EIntfCastError в COM-объектах: Решение через изменение модели потока в Delphi
Введение
Работа с компонентами COM (Component Object Model) является неотъемлемой частью разработки в среде Delphi, особенно когда дело доходит до взаимодействия с внешними приложениями и сервисами. Одна из распространённых проблем, с которой сталкиваются разработчики, - это возникновение исключения EIntfCastError с сообщением "Interface not supported". Данная статья посвящена решению этой проблемы, которая проявляется при запуске приложения в виде Windows Service, то есть через TServiceApplication.
Описание проблемы
При работе с COM-объектами в приложениях, запущенных как Windows-сервисы, может возникать исключение EIntfCastError. Это связано с несоответствием типов интерфейсов при попытке их использования в контексте сервиса. Проблема не проявляется, если запустить приложение в обычном режиме, включая запуск с использованием утилиты srvany.exe.
Пример кода
В коде представлен пример взаимодействия с COM-объектом через интерфейс IMyInter. Создается объект TMyObject, который использует интерфейс IMyInter для работы с COM-сервисом.
type
IMyInter = interface (IUnknown)
['{9E6B311E-C6D3-4687-B272-3FBE9DBC2DD6}']
//... Описание методов интерфейса
end;
type
TMyObject = class
private
FMyInter: IMyInter;
published
constructor Create(const ClassID: TGUID);
end;
constructor TMyObject.Create(const ClassID: TGUID);
begin
CoInitialize(nil);
FMyInter := CreateComObject(ClassID) as IMyInter;
//... Дополнительный код
end;
Анализ проблемы
Ошибка EIntfCastError возникает после вызова функции CreateComObject и попытки присвоения результата переменной FMyInter. При этом оба приложение и COM-объект являются 32-битными, а работа ведется на 64-битной системе Windows 7 с использованием Delphi XE3. COM-объект зарегистрирован с помощью утилиты regsvr32.exe.
Альтернативный ответ и комментарии
В процессе обсуждения проблемы было выяснено, что проблема может быть связана с настройками COM-сервера. В частности, было предложено изменить модель потока сервера с tmSingle на tmApartment.
Подтвержденное решение
Разработчик, столкнувшийся с проблемой, нашел решение, изменив модель потока COM-сервера с tmSingle на tmApartment. После этого он перерегистрировал сервер, и проблема была решена.
initialization
TComObjectFactory.Create( ComServer, TMyComServerClass, Class_ComServerClassGUID, ‘My Com Server Class’, ‘My Descriptive text’, ciMultiInstance, tmApartment);
Заключение
Проблема EIntfCastError в COM-объектах может быть решена через изменение модели потока сервера. Это изменение необходимо для корректной работы в контексте Windows Service. Важно понимать, что настройка модели потока - это ключевой момент в настройке COM-серверов, и его следует тщательно продумывать в зависимости от требований приложения.
Приведенный выше пример кода и подход к решению проблемы могут быть полезны для разработчиков, сталкивающихся с аналогичными трудностями при работе с COM-объектами в среде Delphi.
Описание: Статья посвящена решению проблемы возникновения ошибки `EIntfCastError` при работе с COM-объектами в приложениях, запущенных как Windows-сервисы, и предлагает способ решения через изменение модели потока сервера в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.