2011-09-06 129 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时无论如何伤害设置这些属性。 –