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

Проблема совместимости ActiveX-контролов на Delphi 7 и Delphi XE4 с MFC-программами

Delphi , Технологии , ActiveX

Обновление ActiveX-контролов в Delphi: от Delphi 7 до XE4

Совместимость ActiveX-контролов, созданных в различных версиях Delphi, может быть проблематичной, особенно при их интеграции с MFC-программами. В данной статье мы рассмотрим проблему, с которой столкнулись разработчики, пытающиеся использовать один и тот же ActiveX-контроль, созданный на базе TPanel в Delphi 7, в приложениях на Delphi XE4 и XE2, где MFC выдаёт утверждение.

Проблема

При создании ActiveX-контроля на основе TPanel в Delphi 7, он успешно добавляется в MFC-приложение и работает корректно. Однако, при компиляции того же кода в Delphi XE4 и XE2, MFC выдаёт утверждение. Изменения затрагивают только файлы dcu, ocx и res. Ошибка возникает на строке ASSERT(wFlags == DISPATCH_METHOD) в файле occsite.cpp, что указывает на проблему с флагами вызова метода.

Исследование

Проблема связана с изменением в поведении вызовов методов и получения свойств в новых версиях Delphi. В частности, в Delphi XE4 и XE2 изменился механизм обработки событий, отправляемых обратно хосту контрола (например, OnClickEvent, OnMouseEnter, OnMouseLeave и другие).

Возможные решения

  1. Комментирование кода, вызывающего эти события.
  2. Комментирование строк в ComObjs.DispatchInvoke, вызывающих установку флагов.
  3. Модификация ComObjs для использования альтернативных версий DispatchInvoke и DispCallByID. Необходимо изменить глобальную переменную DispCallByIDProc, чтобы она указывала на альтернативную функцию при работе с событиями, и восстановить её значение после выполнения.

Подтвержденный ответ

Проблема может быть решена путём изменения условия утверждения на ASSERT(wFlags & DISPATCH_METHOD), что позволит корректно обрабатывать вызовы, содержащие флаги DISPATCH_METHOD и DISPATCH_PROPERTYGET одновременно.

Пример кода

procedure TComObj.DispatchInvoke(const Dispatch: IDispatch; CallDesc: PCallDesc;
  DispIDs: PDispIDList; Params: Pointer; Result: PVariant);
var
  ..., InvKind: Integer;
  ...
begin
  ...
  InvKind := CallDesc^.CallType;
  ...
  if InvKind = DISPATCH_PROPERTYPUT then
  begin
    ...
  end
  else if (InvKind and DISPATCH_METHOD) and (CallDesc^.ArgCount = 0) and (Result <> nil) then
      InvKind := DISPATCH_METHOD or DISPATCH_PROPERTYGET;
  ...
  Status := Dispatch.Invoke(..., InvKind, ..., Result, ...);
  ...
end;

Заключение

При переходе на новые версии Delphi важно учитывать изменения в поведении компонентов и библиотеках, чтобы обеспечить совместимость с существующими приложениями. В случае с ActiveX-контролами, рекомендуется тщательно тестировать и, при необходимости, адаптировать код под новые требования и стандарты.

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

Обновление ActiveX-контролов, созданных в Delphi 7, для их работы в новых версиях Delphi, таких как XE4, может потребовать адаптации к изменениям в обработке вызовов методов и событий.


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

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




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


:: Главная :: ActiveX ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 22:58:58/0.0034720897674561/0