我测试基于注册的.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;
它可以帮助,如果你告诉我们的错误... – Leo 2010-03-25 09:56:33
@Mef:好了更多的信息在错误补充。奇怪的是,与D2009 TOleControl.CreateInstance(在OleCtrls.pas中)是完全相同的功能,但CoGetClassObject的调用不会引发AV。 – DamienD 2010-03-25 11:03:53