我正在基于已注册的.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;
答案 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文件。