Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение ошибки "недопустимое приведение типов классов" при использовании слабой ссылки в COM-библиотеках Delphi

Delphi , Технологии , COM и DCOM

Устранение ошибки "недопустимое приведение типов классов" при использовании слабой ссылки в COM-библиотеках Delphi

В последних версиях Delphi, начиная с Berlin 10.1, была добавлена возможность использования слабых ссылок. Слабые ссылки позволяют избежать удержания объектов в памяти, когда на них больше нет ссылок, что может быть полезно в определенных сценариях, например, при работе с COM-объектами.

Однако, при использовании слабых ссылок в COM-библиотеках могут возникать ошибки. В частности, пользователь столкнулся с проблемой, когда разделение реализации COM-объектов на две отдельные библиотеки приводило к ошибке "недопустимое приведение типов классов" при использовании слабой ссылки. Ошибка исчезала, когда атрибут [weak] удалялся из кода.

Пример кода

В первом файле .ridl определены интерфейсы и CoClass для контейнера:

[
  uuid(E1EE3651-A400-49BF-B5C5-006D9943B9C0),
  version(1.0)
]
library DelphiIntfComLib
{
// ...
}

В втором файле .ridl определен CoClass для содержимого, который ссылается на первый файл:

[
  uuid(65659EE4-1949-4112-88CA-F2D5B5D8DA2C),
  version(1.0)
]
library DelphiImplComLib
{
// ...
}

Имплементация контейнера и содержимого включает использование слабой ссылки, которая вызывает ошибку при разделении библиотек:

unit Unit2;
// ...
type
  TMyContent = class(TAutoObject, IMyContent)
  private
   [Weak] // Если включить, появится ошибка "недопустимое приведение типов классов"
    FContainer : IMyContainer;
  end;
// ...

Решение проблемы

Слабая ссылка в Delphi предназначена для использования с объектами, которые наследуются от TObject. COM-интерфейсы, которые могут не быть реализованы классами Delphi, не могут корректно обрабатывать слабые ссылки. Поэтому использование атрибута [weak] с COM-интерфейсами не поддерживается.

Для устранения ошибки можно использовать следующие подходы:

  1. Использование указателя вместо слабой ссылки:

Можно использовать обычный указатель вместо слабой ссылки, если не требуется автоматическое освобождение ссылки при уничтожении объекта. Пример:

pascal type TMyContent = class(TAutoObject, IMyContent) private FContainer : Pointer<IMyContainer>; end;

При необходимости использования методов интерфейса, нужно будет выполнить приведение типа.

  1. **Использование атрибута [unsafe]:

В версиях Delphi 10.1 Berlin и выше можно использовать атрибут [unsafe], который отключает автоматический подсчет ссылок:

pascal type TMyContent = class(TAutoObject, IMyContent) private [Unsafe] FContainer : IMyContainer; end;

Это позволит избежать удержания объекта в памяти, но потребует от разработчика самостоятельно управлять жизненным циклом объектов.

Заключение

При работе с COM-библиотеками в Delphi важно понимать ограничения использования слабых ссылок. Если необходимо использовать слабую ссылку на объект, который не является потомком TObject, следует пересмотреть архитектуру приложения или использовать альтернативные подходы, такие как использование указателя или атрибута [unsafe].

Создано по материалам из источника по ссылке.

Контекст вопроса связан с устранением ошибки "недопустимое приведение типов классов" при использовании слабых ссылок в COM-библиотеках Delphi, особенно при разделении реализации COM-объектов на разные библиотеки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: COM и DCOM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 01:02:22/0.0033659934997559/0