Delphi Excel COM-Addin - PullRequest
       20

Delphi Excel COM-Addin

4 голосов
/ 06 сентября 2011

Я пишу MS Excel COM-Addin в Delphi 2006. У меня установлен 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 Addin, однако он будет установлен в Excel.Я просто получаю сообщение об ошибке «Не загружен. Произошла ошибка во время загрузки COM-надстройки»

Может кто-нибудь увидеть проблемы с моим интерфейсом?или как я создаю ком объект?Есть ли способ отладить это?

Спасибо

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

Вы неправильно указали 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. Я настоятельно рекомендую вам сделать то же самое.

1 голос
/ 06 сентября 2011

Да, есть способ отладки:

  1. Закрыть Excel
  2. Открыть параметры проекта (Ctrl + Shift + F11)
  3. Перейти кВкладка компоновщика
  4. Проверка Включение отладочной информации TD32 и Включение символов удаленной отладки .(Может быть, требуется только первое, но лучше, чем потом сожалеть)
  5. Перейти к параметрам запуска (меню «Пуск», Параметры ...)
  6. Изменить приложение хоста на Excel
  7. Перестройте и запустите, как только ваш аддин будет загружен, вы можете начать отладку.

Когда вы никогда не приступаете к отладке, это означает, что проблема, вероятно, не в вашем коде инициализации, тогда, возможно, естьпроблема с загрузкой необходимых пакетов или ваш аддин неправильно реализует интерфейс _IDExtensibility.

...