具有旧Delphi版本的ActiveX控件

时间:2010-03-25 07:19:28

标签: delphi activex

我正在基于已注册的.ocx测试非可视化ActiveX控件 我使用提供的向导导入Delphi。

然后,我只是将生成的组件放在新VCL应用程序的主窗体上。

在旧的Delphi版本(D5和D2007)下,当我启动应用程序时,这会引发AV 在组件初始化期间。

使用Delphi 2009:没问题,应用程序启动顺利。

我的问题是:

最近的Delphi版本中是否存在已知的ActiveX管理增强功能 可以解释这种差异吗?

我可以怀疑ActiveX控件中的错误,还是可以考虑它的起源? 问题来自旧的Delphi版本?

我需要在D2007中使用此组件(如果测试正常)。 您是否认为可以通过修改D2007生成的.tlb文件来纠正D2007下的AV问题(例如通过尝试使用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 个答案:

答案 0 :(得分:1)

据我所知,Delphi 2009中的ActiveX / TLB导入有很大的改进(与Unicode支持相关) - 这可能解释了它。

根据我的个人经验,Delphi 7和Delphi 2007多次无法导入一些Windows 7类型的库(各种新的界面可以使用新的任务栏),但Delphi 2009完全没有任何问题。

至于在早期版本中使用Delphi 2009生成的文件 - 请注意Unicode问题。此外,如果缺陷在RTL中,它将无济于事...尝试在Delphi 2009中制作包装ActiveX并在Delphi 2007中使用它 - 这应该可行。

答案 1 :(得分:0)

很抱歉在战斗结束后这么晚才进行闯入(事实上是5年后),但是我在这个问题上浪费了太多时间,我认为我应该分享我所看到的以及我所做的事情。解决它: 2台机器(win7 64 / win 8.1)相同的delphi 7(相同版本相同版本),相同的activeX(MapX来命名),包含由59个字符组成的密钥的相同.lic文件:

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);

转换为2个char键

PM

将一个const替换为另一个const并重新编译该组件解决了我的问题。我真的不知道发生了什么。我只知道Import / TLB产生了一个可以手动纠正的坏.pas文件。