我測試基於註冊的.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