2011-09-06 137 views
4

我在Delphi 2006中寫了一個MS Excel COM-Addin。我在我的開發機器上安裝了Excel 2007。Delphi Excel COM-Addin

我將該項目作爲ActiveX庫啓動,然後從Delphi ActiveX項目菜單中添加一個自動化對象。

以我自動化對象予定義的IDTExtensibility2接口作爲

IDTExtensibility2 = interface(IDispatch) 
    ['{32E456FC-C710-43AA-9ACA-DDE8F132B91B}'] 
    function OnAddinsUpdate(var w_Custom: OleVariant): HResult; stdcall; 
    function OnBeginShutDown(var w_Custom: OleVariant): HResult; stdcall; 
    function OnConnection(const w_Application: IDispatch; w_ConnectMode: Integer; 
         const w_AddInInst: IDispatch; var w_Custom: OleVariant): HResult; stdcall; 
    function OnDisconnection(w_DisconnectMode: Integer; var w_Custom: OleVariant): HResult; stdcall; 
    function OnStartupComplete(var w_Custom: OleVariant): HResult; stdcall; 
end; 

並且在從TAutoObject派生的類實現的接口。

在單元的初始化部分我稱之爲

TAutoObjectFactory.Create(ComServer, TPBSExcelAddin, Class_PBSExcelAddin, ciSingleInstance, tmApartment); 

COM對象登記罰款和Excel加載項的選項顯示出來但它會在Excel中進行安裝。我剛剛得到錯誤「未加載,加載COM Addin時發生錯誤」

任何人都可以看到我的界面有問題嗎?或者我創建COM對象的方式?有沒有一種方法來調試呢?

謝謝

+0

我試着做這個回來。很難做到這一點。最終我發現了插件Express,我不能推薦得夠高。 –

+0

謝謝大衛。我已經考慮過插件快車,但我寧願從頭開始爲我自己的學習做。 –

+1

祝你好運! –

回答

4

您的申明是IDTExtensibility2錯誤。它應該是:

IDTExtensibility2 = interface(IDispatch) 
    ['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}'] 
    procedure OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode; 
         const AddInInst: IDispatch; var custom: PSafeArray); safecall; 
    procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall; 
    procedure OnAddInsUpdate(var custom: PSafeArray); safecall; 
    procedure OnStartupComplete(var custom: PSafeArray); safecall; 
    procedure OnBeginShutdown(var custom: PSafeArray); safecall; 
end; 

要記住的一件事是,接口中的方法必須按正確的順序聲明 - 您聲明它們的順序是錯誤的。我也不知道你從哪裏得到你的GUID。

我通過導入Microsoft Add-In Designer的類型庫來獲得此接口聲明。我強烈建議你也這樣做。

+0

謝謝。我確實設法自己解決了這個問題,它花了一點時間搜索互聯網,直到我發現您可以導入類型庫而不是自己聲明它。這實際上是第一次編寫COM Addin,所以我不知道類型庫導入。我已經制定了如何添加按鈕和事件,如預期的那樣在Addin選項卡上顯示。 –

+0

很高興聽到您的加載項已啓動並正在運行。現在我祝你好運,編寫代碼與Ribbon進行交互!好好玩。 –

1

是的,有調試這個辦法:

  1. 關閉Excel
  2. 打開項目選項(按Ctrl + Shift + F11)
  3. 轉到Linker選項卡
  4. 檢查包含TD32調試信息包含遠程調試符號。 (也許只有第一個是需要的,但有備無患)
  5. 轉到儘快運行參數(運行菜單,參數......)
  6. 更改主機應用到Excel
  7. 重新生成並運行,爲您的加載程序加載後即可開始調試。

當你從來沒有進入調試,這意味着該問題可能不是在你的初始化代碼,那麼可能存在與加載必要的軟件包,或者你的插件沒有實現_IDExtensibility接口以正確的方式有問題。

+0

感謝The_Fox,這非常有幫助。但是,在Delphi中定義IDTExtensibility接口的正確方法是什麼?我不確定用於自定義和應用程序參數的類型。 –

+0

第4步是沒有必要的 –

+0

@大衛赫弗南:我記得一些問題試圖調試(不能設置斷點),通過設置主機的應用程序,我想我解決了第4步:它沒有一個dll/BPL時無論如何傷害設置這些屬性。 –