Элементы управления ActiveX со старыми версиями Delphi - PullRequest
0 голосов
/ 25 марта 2010

Я тестирую невизуальный элемент управления ActiveX на основе зарегистрированного .ocx который я импортирую в Delphi, используя предоставленный мастер.

Затем я просто помещаю сгенерированный компонент в основную форму нового приложения VCL.

В старых версиях Delphi (D5 и D2007), когда я запускаю приложение, это вызывает AV во время инициализации компонента.

с Delphi 2009: нет проблем, приложение запускается без проблем.

Мои вопросы:

Известны ли улучшения в управлении ActiveX в последних версиях Delphi, которые можете объяснить эту разницу?

Могу ли я подозревать ошибку в элементе управления ActiveX, или я могу определить происхождение проблема из старых версий Delphi?

Мне нужно использовать этот компонент (если тесты в порядке) в D2007. Считаете ли вы, что можно исправить проблему AV в D2007, изменив сгенерированный D2007 файл .tlb (например, попытавшись использовать сгенерированный D2009)

PS: элемент управления ActiveX не назван, потому что мой вопрос - это общий вопрос о Delphi и ActiveX, а не о конкретном элементе управления ActiveX.

Редактировать:
В D2007 ошибка (нарушение прав доступа) появляется во время Application.CreateForm (TForm1, Form1);
и более конкретно, когда создается Olecontrol:

procedure TOleControl.CreateInstance;
var
  ClassFactory2: IClassFactory2;
  LicKeyStr: WideString;

  procedure LicenseCheck(Status: HResult; const Ident: string);
  begin
    if Status = CLASS_E_NOTLICENSED then
      raise EOleError.CreateFmt(Ident, [ClassName]);
    OleCheck(Status);
  end;

begin
  if not (csDesigning in ComponentState) and
    (FControlData^.LicenseKey <> nil) then
  begin
    // ON THE LINE BELOW : the call of CoGetClassObject raise an AV
    OleCheck(CoGetClassObject(FControlData^.ClassID, CLSCTX_INPROC_SERVER or
      CLSCTX_LOCAL_SERVER, nil, IClassFactory2, ClassFactory2));
    LicKeyStr := PWideChar(FControlData^.LicenseKey);
    LicenseCheck(ClassFactory2.CreateInstanceLic(nil, nil, IOleObject,
      LicKeyStr, FOleObject), SInvalidLicense);
  end else
    LicenseCheck(CoCreateInstance(FControlData^.ClassID, nil,
      CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IOleObject,
      FOleObject), SNotLicensed);
end;

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Насколько я помню, в Delphi 2009 были значительно улучшены возможности импорта ActiveX / TLB (связанные с поддержкой Unicode) - это может объяснить это.

Из моего личного опыта Delphi 7 и Delphi 2007 неоднократно не могли импортировать некоторые библиотеки типов Windows 7 (различные новые интерфейсы для работы с новой панелью задач), но Delphi 2009 справился с этим без каких-либо проблем.

Что касается использования сгенерированного Delphi 2009 файла в более ранних версиях - остерегайтесь проблем с Unicode. Плюс, это не поможет, если дефект в RTL ... Попробуйте создать обертку ActiveX в Delphi 2009 и использовать ее в Delphi 2007 - это должно работать.

0 голосов
/ 28 января 2016

Извините, что на барже так поздно после битвы (на самом деле 5 лет спустя), но я потратил так много времени на эту конкретную проблему, что я решил поделиться тем, что видел и что сделал решить это: 2 машины (win7 64 / win 8.1), тот же delphi 7 (та же версия, та же сборка), один и тот же activeX (назовите его MapX) с одинаковыми .lic файлами, содержащими ключ из 59 символов:

uQnZi2sFw22L0-MRa8pYX-1E2P8065-5N5M3459-3C934220-04969-6562

тот же импорт, производящий 2 немного отличающихся TLB.

Один работает: (на win 8.1) содержит это в процедуре TMap.InitControlData:

const
  CLicenseKey: array[0..61] of Word = ( $0075, $0051, $006E, $005A, $0069, $0032, $0073, $0046, $0077, $0032, $0032
    , $004C, $0030, $002D, $004D, $0052, $0061, $0038, $0070, $0059, $0058
    , $002D, $0031, $0045, $0032, $0050, $0038, $0030, $0036, $0035, $002D
    , $0035, $004E, $0035, $004D, $0033, $0034, $0035, $0039, $002D, $0033
    , $0043, $0039, $0033, $0034, $0032, $0032, $0050, $0030, $002D, $004D
    , $0030, $0034, $0039, $0036, $0039, $002D, $0036, $0035, $0036, $0032
    , $0000);

, что соответствует 61 символу

uQnZi2sFw22L0-MRa8pYX-1E2P8065-5N5M3459-3C93422P0-M04969-6562

TLB, который не работает (win 7 64), содержит это вместо:

const
  CLicenseKey: array[0..2] of Word = ( $0050, $004D, $0000);

, что переводится как ключ с двумя символами

PM

Замена одной константы другой и перекомпиляция компонента решили мою проблему. Я действительно не знаю, что случилось. Я просто знаю, что Import / TLB создал плохой файл .pas, который можно исправить вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...