2010-03-25 104 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文件。