【问题标题】:Delphi Excel COM-AddinDelphi Excel COM-Addin
【发布时间】:2011-11-11 00:53:05
【问题描述】:

我正在用 Delphi 2006 编写 MS Excel COM-Addin。我的开发机器上安装了 Excel 2007。

我将项目作为 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 插件期间发生错误”

谁能看到我的界面有问题?还是我创建 com 对象的方式?有没有办法调试这个?

谢谢

【问题讨论】:

  • 我在不久前尝试过这样做。很难做到正确。最终我发现了我无法高度推荐的 Add-in Express。
  • 谢谢大卫。我曾考虑过 Add-in Express,但我宁愿自己从头开始学习。

标签: delphi excel com add-in


【解决方案1】:

您的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 的类型库获得了这个接口声明。我强烈建议您也这样做。

【讨论】:

  • 谢谢。我确实设法自己弄清楚了,花了一些时间在互联网上搜索,直到我发现您可以导入类型库而不必自己声明它。这真的是第一次写COM Addin所以我不知道类型库导入。我已经弄清楚如何添加按预期显示在“插件”选项卡上的按钮和事件。
  • 很高兴听到您的加载项已启动并正在运行。现在我祝你好运,编写代码与功能区交互!这很有趣。
【解决方案2】:

是的,有一种调试方法:

  1. 关闭 Excel
  2. 打开项目选项 (Ctrl+Shift+F11)
  3. 转到链接器选项卡
  4. 检查包括 TD32 调试信息包括远程调试符号。 (也许只需要第一个,但安全总比后悔好)
  5. 转到运行参数(运行菜单、参数...)
  6. 将宿主应用程序更改为 Excel
  7. 重新构建并运行,加载插件后即可开始调试。

如果您从未进行调试,这意味着问题可能不在您的初始化代码中,那么可能是加载必要的包时出现问题,或者您的插件没有以正确的方式实现 _IDExtensibility 接口。

【讨论】:

  • 感谢 The_Fox 非常有帮助。但是在 Delphi 中定义 IDTExtensibility 接口的正确方法是什么?我不确定自定义和应用程序参数使用什么类型。
  • @David Heffernan:我记得在尝试通过设置主机应用程序来调试(无法设置断点)dll/bpl 时出现一些问题,我认为我在第 4 步中解决了这些问题。它没有伤害无论如何都要设置这些属性。
  • 您只需要在使用依赖于 TD32 符号的调试器时设置这些属性。
  • 我认为问题在于如何声明接口。有人可以给我正确的 Delphi 接口定义吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多