【发布时间】:2011-01-31 14:30:01
【问题描述】:
我正在测试一个基于已注册 .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;
【问题讨论】:
-
如果您告诉我们错误可能会有所帮助...
-
@Mef : OK 更多关于错误的信息。奇怪的是,与 D2009 TOleControl.CreateInstance(在 OleCtrls.pas 中)是完全相同的函数,但 CoGetClassObject 的调用不会引发 AV。