2010-03-25 95 views
0

我测试基于注册的.ocx 我导入到德尔福使用所提供的向导,非可视ActiveX控件控制。的ActiveX旧版本的Delphi

然后,我只是把一个新的VCL应用的主要形式所产生的组件。

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

德尔福2009年:没问题,应用程序启动顺利。

我的问题是:

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

我可以怀疑ActiveX控件中存在一个错误吗?或者我可以认为 问题的来源是从旧的Delphi版本开始的?

我需要在D2007中使用此组件(如果测试正常)。 您认为可以通过修改D2007生成的.tlb文件(例如尝试使用D2009生成的文件)来纠正D2007下的AV问题。

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; 
+0

它可以帮助,如果你告诉我们的错误... – Leo 2010-03-25 09:56:33

+0

@Mef:好了更多的信息在错误补充。奇怪的是,与D2009 TOleControl.CreateInstance(在OleCtrls.pas中)是完全相同的功能,但CoGetClassObject的调用不会引发AV。 – DamienD 2010-03-25 11:03:53

回答

1

至于我记得有重大改进,在2009年德尔福的ActiveX/TLB进口(与Unicode支持) - 这或许可以解释它。

就我个人的经验,德尔福7和Delphi 2007多次未能导入某些Windows 7的类型库(各种新的接口与新的任务栏工作),但2009年德尔福管理是没有任何问题的。

至于使用德尔福2009年发生在早期版本的文件 - 当心Unicode的问题。另外,如果缺陷是在RTL中,它将无济于事...尝试在Delphi 2009中制作一个包装ActiveX,并在Delphi 2007中使用它 - 这应该可行。

+0

感谢您提供有关您的体验的反馈。我试图用D2009构建包装器,但获得了相同的AV。我会考虑将我的项目移至D2009 ......因为它似乎是获得良好ActiveX处理的唯一方法。 – DamienD 2010-03-26 11:58:44

+0

我也接受你的回答,因为它清楚地表明我的问题来自以前的Delphi版本中的错误/不完整的ActiveX/tlb管理。 – DamienD 2010-03-26 12:03:11

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不工作(赢7 64)包含此代替:

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

其转换为一个2 char key

PM 

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