Надстройка com для word

0 / 0 / 0

Регистрация: 29.11.2018

Сообщений: 51

1

09.10.2019, 21:00. Показов 1089. Ответов 3


Студворк — интернет-сервис помощи студентам

я создаю шаблон надстройки VSTO для Microsoft Word, затем добавляю форму в которой имеются несколько элементов textBox. Как я могу перенести введенную в них информацию в Word при нажатии на кнопку?

ещё, если я ввожу, например, в 1 textBox = a, во 2 textBox = b, могу ли я как то сложить их, и сумму также вывести в документ Word?



0



BlackEric

88 / 62 / 18

Регистрация: 09.12.2015

Сообщений: 174

10.10.2019, 17:10

2

Берете и вставляете значение в документ. На месте курсора

C#
1
2
Word.Range rng = this.Application.ActiveDocument.Range(0, 0);
rng.Text = "Текст";



0



0 / 0 / 0

Регистрация: 29.11.2018

Сообщений: 51

10.10.2019, 20:00

 [ТС]

3

Я создаю надстройку VSTO для Microsoft Word с помощью visual studio. Как мне сделать так, чтобы при нажатии на кнопку в ленте word открывалось окно windows forms, а затем введенные значения в эту форму отображались на листе документа?



0



0 / 0 / 0

Регистрация: 29.11.2018

Сообщений: 51

10.10.2019, 20:29

 [ТС]

4

а если я добавляю элемент управления «лента», которая содержит кнопку, как я могу открыть окно windows forms для взаимодействия с пользователем, нажав на эту кнопку?

 Комментарий модератора 
не следует дублировать темы, можно и в первую добавить дополнительные пояснения своих желаний



0



Модель модулей расширения Microsoft Office 2000

Интерфейс IDTExtensibility2

Внедрение в объектную модель Office

COM Events

   Введение

   Базовый класс обработчика COM-событий

   Обработчик событий от CommandBarButton

Регистрация модулей

Пишем COM Add-In

   Библиотеки типов Office 2000

   Создаем COM-сервер

   Отладка модулей расширения

   Реализуем функциональность

   Написание надстроек, работающих с несколькими приложениями Office

Модель модулей расширения Microsoft Office 2000

В Office 2000
Microsoft ввела единый API для написания
подключаемых модулей, расширяющих
функциональные возможности пакета. Теперь
стало возможно написание модулей, которые
интегрируются с
любым из приложений пакета. Разработанный
набор интерфейсов упрощает создание
расширений, позволяя программисту
сконцентрироваться на функциональности, а
не на изучении особенности каждого из
приложений.

Новая модель подключаемых модулей была
названа COM
Add-Ins.
Как следует из названия, модуль расширения (Add-In)
представляет собой COM-сервер,
который специальным образом
зарегистрирован в операционной системе.
При загрузке приложение пакета Office
загружает
зарегистрированные расширения и вызывает
их методы, позволяя установить обработчики
на необходимые для их дальнейшего
функционирования события. По завершении
работы приложение Office
извещает об этом модули расширения,
позволяя последним корректно освобождать
ресурсы.

Общение модулей расширения с загрузившим
их приложением происходит с помощью
объектной модели Microsoft
Office.

Использование COM Add-In позволяет в корне изменить подходы к интеграции приложений
с Microsoft Office. Например, вместо того чтобы вызывать Word для генерации
отчетов, можно, наоборот, встроить в него меню со списком отчетов, а по выбору
пользователем нужного отчета  — запросить данные из базы данных и сформировать
по ним документ.

Интерфейс IDTExtensibility2

Ключевым моментом в написании COM
Add-In
является реализация им интерфейса IDTExtensibility2,
определенного следующим образом:

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

После загрузки зарегистрированного в
качестве расширения COM-сервера
Office
запрашивает у него этот интерфейс и, если он
реализован, вызывает соответствующие
методы, позволяя расширению реализовать
свою функциональность.

Рассмотрим
методы IDTExtensibility2 подробнее:

procedure OnConnection(
   const HostApp: IDispatch;  
   ext_ConnectMode: Integer;
   const AddInInst: IDispatch;
   var custom: PSafeArray
 ); safecall;  

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

Параметры, передаваемые методу:

HostApp

Ссылка
на интерфейс IDispatch вызывающего
приложения. Если модуль расширения планирует в
дальнейшем обращаться к его объектной
модели, он должен сохранить ссылку в
переменной

ext_ConnectMode

Константа,
информирующая о том, по какой причине
производится загрузка:

ext_cm_AfterStartup
— модуль расширения загружен после
загрузки хотя бы одного документа Office

ext_cm_External
— модуль расширения загружен другим
компонентом

ext_cm_Startup
— модуль расширения загружен до
загрузки хотя бы одного документа Office

ext_cm_CommandLine
— не используется в Office 2000

AddinInst

Ссылка на интерфейс IDispatch
загружаемого модуля расширения 

Custom

Здесь и далее — в Microsoft
Office
не используется

procedure OnDisconnection(ext_DisconnectMode: Integer;
   var custom: PSafeArray); safecall;  

Вызывается
при выгрузке модуля расширения. Этот
метод должен произвести освобождение
занятых ресурсов и прочие процедуры по
завершении работы COM-сервера.

Параметр
ext_DisconnectMode информирует о причине выгрузки
COM-сервера и может принимать следующие
значения:

ext_dm_HostShutdown
– приложение завершает работу;

ext_dm_UserClosed
– модуль расширения выгружен
пользователем.

procedure OnAddInsUpdate(var custom: PSafeArray); safecall;  

Вызывается при изменении списка
загруженных модулей расширений. COM-сервер
может проанализировать коллекцию
расширений приложения и предпринять
необходимые действия, требующие
взаимодействия с другими 
модулями расширений.

procedure OnStartupComplete(var custom: PSafeArray); safecall; 

Вызывается по завершении инициализации приложения. Те модули расширений, которые
должны предоставлять интерфейс пользователя при запуске приложения, должны делать
это в методе OnStartupComplete, когда приложение полностью завершило этап инициализации.

procedure BeginShutdown(var custom: PSafeArray); safecall; 

Вызывается в начале процесса завершения приложения, позволяя расширениям предпринять
в этот момент какие-либо действия.

Внедрение в объектную модель Office

Как было показано в предыдущем разделе, расширению доступен интерфейс IDispatch
вызывающего приложения. Таким образом, оно может модифицировать интерфейс этого
приложения, добавляя и удаляя необходимые интерфейсные элементы, создавать документы,
вызывать различные методы для работы с ними. Однако, как правило, помимо этого
необходимо обеспечить реакцию на различные события в вызывающем приложении (такие
как изменение документа или нажатие кнопки на панели инструментов). Для этого
Add-In должен установить обработчик соответствующего события. Прежде чем перейти
к вопросам реализации, совершим небольшой экскурс по событиям COM и их обработчикам.

COM Events

Введение

Если COM-объект
хочет получать информацию о событиях в
другом COM-объекте, то он должен уведомить об
этом объект-источник событий,
зарегистрировав себя в списке объектов-получателей
уведомлений о событиях. Модель COM
предоставляет для этого стандартный
механизм.

Объект-источник
событий (в нашем случае – приложение Office,
документ, кнопка на панели инструментов и т.п.)
реализует интерфейс IConnectionPointContainer. Объект,
нуждающийся в оповещении о событиях, должен
запросить у источника этот интерфейс, затем
при помощи метода FindConnectionPoint
получить «точку подключения» – интерфейс IConnectionPoint
и посредством вызова метода Advise
зарегистрировать в этой точке подключения
ссылку на свою реализацию интерфейса IDispatch,
методы которого будут вызываться при
возникновении тех или иных событий в
источнике событий.

Различные
объекты Office определяют интерфейсы, которым
должны соответствовать обработчики их
событий. Так, например, для объекта CommandBarButton
(кнопка на панели инструментов) определен
интерфейс обработчика –

type
     _CommandBarButtonEvents = dispinterface
       ['{000C0351-0000-0000-C000-000000000046}']
       procedure Click(const Ctrl: CommandBarButton;
         var CancelDefault: WordBool); dispid 1;
     end; 

Это означает, что при нажатии кнопки будет вызван метод Invoke зарегистрированного
интерфейса-обработчика, с параметром DispId, равным 1. При этом параметр pDispIds
будет содержать указатель на вариантный массив из двух параметров — соответственно
типов CommandBarButton и WordBool.

Базовый класс обработчика COM-событий

Реализуем базовый класс обработчика COM-событий.
Реализация взята из модуля SinkObject.pas,
написанного Бином Ли (Binh Ly, http://www.techvanguards.com/).

type
     TBaseSink = class(TObject, IUnknown, IDispatch)
     protected
       { методы IUnknown }
       function QueryInterface(const IID: TGUID; out Obj): HResult;
         stdcall;
       function _AddRef: Integer; stdcall;
       function _Release: Integer; stdcall;
       { методы IDispatch }
       function GetIDsOfNames(const IID: TGUID; Names: Pointer;
         NameCount, LocaleID: Integer; DispIDs: Pointer):    HResult;
         virtual; stdcall;
       function GetTypeInfo(Index, LocaleID: Integer;
         out TypeInfo): HResult; virtual; stdcall;
       function GetTypeInfoCount(out Count: Integer): HResult;
         virtual; stdcall;
       function Invoke(DispID: Integer; const IID: TGUID;
         LocaleID: Integer; Flags: Word; var Params;
         VarResult, ExcepInfo, ArgErr: Pointer): HResult;
         virtual; stdcall; 
  private
     FCookie: Integer;
     FCP: IConnectionPoint;
     FSinkIID: TGuid;
     FSource: IUnknown;
     function DoInvoke(DispID: Integer; const IID: TGUID;
       LocaleID: Integer;  Flags: Word; var dps: TDispParams;
       pDispIds: PDispIdList;  VarResult, ExcepInfo,
       ArgErr: Pointer): HResult; virtual; abstract;  
  public
     destructor Destroy; override;
     procedure Connect(pSource : IUnknown);
     procedure Disconnect;
     property SinkIID: TGuid read FSinkIID;
     property Source: IUnknown read FSource;
   end;  

Рассмотрим реализацию ключевых методов этого класса. Метод QueryInterface в
дополнение к стандартной реализации проверяет, нет ли попыток запросить интерфейс
обработчика событий. В этом случае возвращается IDispatch, позволяющий объекту-источнику
событий вызвать метод Invoke:

function TBaseSink.QueryInterface(const IID: TGUID;
     out Obj): HResult;
   begin
     Result := E_NOINTERFACE;
     Pointer(Obj) := NIL;
     if GetInterface(IID, Obj) then
       Result := S_OK;
     // если запрашивается интерфейс SinkIID -
     // возвращаем свой IDispatch
     if not Succeeded(Result) then
       if IsEqualIID(IID, FSinkIID) then
         if GetInterface(IDispatch, Obj) then
           Result := S_OK;
   end; 

Метод Connect регистрирует COM-объект в качестве обработчика событий COM-объекта
pSource. Обращаю внимание, что переменная FCP объявлена как поле класса, поскольку
он должен удерживать счетчик ссылок на «точку подключения», пока она используется.
Если объявить FCP как локальную переменную — по завершении метода Connect произойдет
неявный вызов FCP._Release, что приведет к неправильной работе.

procedure TBaseSink.Connect(pSource: IUnknown);
   var
     pcpc: IConnectionPointContainer;
   begin
     Disconnect;
     try
       // Запрашиваем интерфейс IConnectionPointContainer у объекта-
       // источника событий
       OleCheck(pSource.QueryInterface(IConnectionPointContainer,
         pcpc));
       // Запрашиваем интерфейс IConnectionPoint.
       OleCheck(pcpc.FindConnectionPoint(FSinkIID, FCP));
       // Подключаемся к обработчику событий
       OleCheck(FCP.Advise(Self, FCookie));
       // Все прошло успешно - устанавливаем свойство Source
       FSource := pSource;
     except
       raise Exception.Create(Format('Unable to connect %s.'#13'%s',
         [ClassName, Exception(ExceptObject).Message]));
     end;
   end; 

Метод Disconnect отключает обработчик событий от объекта-источника.

procedure TBaseSink.Disconnect;
   begin
     if FSource = NIL then
       Exit;
     try
       OleCheck(FCP.Unadvise(FCookie));
       FCP := NIL;
       FSource := NIL;
     except
       Pointer(FCP) := NIL;
       Pointer(FSource) := NIL;
     end;
   end; 

Метод Invoke вызывается при возникновении события в объекте-источнике. Он осуществляет
предварительную обработку параметров и вызывает абстрактный метод DoInvoke,
который должен быть перекрыт в наследниках, реализующих конкретные интерфейсы
обработчиков событий. Реализация такого наследника будет рассмотрена ниже.

Обработчик событий от CommandBarButton

Наследуя
функциональность от базового класса TBaseSink,
обработчики событий конкретных COM-объектов
реализуются перекрытием методов Create и DoInvoke.
Создадим такой обработчик для кнопки на
панели инструментов Office. Он должен
реализовать интерфейс _CommandBarButtonEvents –

type
     _CommandBarButtonEvents = dispinterface
       ['{000C0351-0000-0000-C000-000000000046}']
       procedure Click(const Ctrl: CommandBarButton;
         var CancelDefault: WordBool); dispid 1;
     end; 

Объявим класс:

type
   // Обработчик события нажатия на кнопку
   TOnCommandButtonClick = procedure (Button: CommandBarButton;
      var CancelDefault: WordBool) of object;
 
   
  TCommandButtonEventSink = class(TBaseSink)
   private
     FOnClick: TOnCommandButtonClick;
   protected
     procedure DoClick(Button: CommandBarButton;
       var CancelDefault: WordBool); virtual;
     function DoInvoke (DispID: Integer; const IID: TGUID;
       LocaleID: Integer; Flags: Word; var dps : TDispParams;
       pDispIds : PDispIdList; VarResult, ExcepInfo,
       ArgErr: Pointer): HResult; override;
   public
     constructor Create; virtual;
     property OnClick: TOnCommandButtonClick
       read FOnClick write FOnClick;
   end;  

В конструкторе установим идентификатор интерфейса обработчика событий, который
мы реализуем.

constructor TCommandButtonEventSink.Create;
   begin
     inherited;
     FSinkIID := _CommandBarButtonEvents;
   end; 

Метод DoClick просто вызывает назначенный классу обработчик события и нужен
для более удобной работы с ним из Delphi.

procedure TCommandButtonEventSink.DoClick(Button: CommandBarButton;
     var CancelDefault: WordBool);
   begin
     if Assigned(FOnClick) then
       FOnClick(Button, CancelDefault);
   end; 

Ключевым методом является DoInvoke, который для каждого DispId, объявленного
в интерфейсе _CommandBarButtonEvents, должен выполнить соответствующие действия.

function TCommandButtonEventSink.DoInvoke(DispID: Integer;
     const IID: TGUID; LocaleID: Integer; Flags: Word;
     var dps: TDispParams; pDispIds: PDispIdList;
     VarResult, ExcepInfo, ArgErr: Pointer): HResult;
   begin
     Result := S_OK;
     case DispID of
       // Для этого DispId передаются 2 параметра – CommandBarButton
       // и WordBool
       1 : DoClick(IUnknown(dps.rgvarg^[pDispIds^[0]].unkval)
             as CommandBarButton,    dps.rgvarg^[pDispIds^[1]].pbool^);
     else
       Result := DISP_E_MEMBERNOTFOUND;
     end;
   end; 

Как видим, реализация конкретного обработчика является практически механической
задачей и не должна вызвать проблем. Если в интерфейсе предусмотрено несколько
методов, то следует подставить в оператор case все их DispId. От программиста
требуется лишь аккуратность при отображении массива dps на параметры соответствующих
обработчиков.

Регистрация модулей

COM Add-In — это COM-сервер, который должен быть зарегистрирован в системе,
например, при помощи TRegSvr.exe или RegSvr32.exe. Однако требуется еще один
шаг — регистрация его в Microsoft Office. Для этого необходимо создать в реестре
раздел с именем.

HKEY_CURRENT_USERSoftwareMicrosoftOffice<Имя приложения>AddIns<Имя>

Здесь:

<Имя приложения> — название приложения, к которому подключается Add-In

<Имя> — имя, под которым
зарегистрирован COM-сервер
(название_проекта.имя_класса)

В этом разделе необходимо создать два параметра:

FriendlyName

Строковый
параметр, определяющий имя, под которым
наше расширение будет видно в менеджере
расширений приложений Microsoft Office

LoadBehavior

Параметр
типа DWORD, определяющий, когда должен
загружаться Add-In

Параметр LoadBehavior может принимать одно из следующих значений:

3

Add-In
загружается при старте приложения

9

Add-In
загружается по требованию (когда его
свойство Connected в колекции AddIns приложения
будет установлено в TRUE)

16

Add-In
загружается один раз при следующем
запуске приложения

Пишем COM Add-In

Библиотеки типов Office 2000

Для работы с объектной моделью Microsoft Office 2000 нам понадобятся библиотеки
типов, описывающие доступные интерфейсы. Поскольку Delphi 5 поставляется с библиотеками
типов от Office 97, необходимо импортировать нужные модули. В любом случае понадобится
библиотека Office_TLB, остальные (Word_TLB, Excel_TLB и т.п.) могут потребоваться
в зависимости от того, к какому приложению будет писаться модуль расширения.

Для импорта воспользуемся меню Import
TypeLibrary.

После создания модулей с описаниями интерфейсов рекомендую вручную удалить
из них ссылки на модули Graphics и OleCtrls, которые приводят к подключению
к проекту модуля Forms, а при компиляции не нужны.

Создаем COM-сервер

Поскольку COM Add-In является COM-сервером, воспользуемся мастерами Delphi
для его создания. Выберем команду New… -> ActiveX -> ActiveX Library.

Затем добавим в созданную библиотеку Automation Object при помощи мастера New…
-> ActiveX -> Automation Object.

В поле
CoClassName введем имя реализуемого интерфейса
(DTExtensibility2). В
принципе,  можно ввести любое имя, требуется
только, чтобы этот интерфейс имел тот же GUID, что и IDTExtensibility,
и аналогичный набор методов.

После того как Delphi создаст новый объект автоматизации, запустим редактор
библиотеки типов. Вначале мы имеем описание интерфейса без методов и со сгенерированным
Delphi значением GUID.

Перейдем на вкладку Text
созданного интерфейса и введем там
следующий текст:

[
   uuid(B65AD801-ABAF-11D0-BB8B-00A0C90F2744),
   version(1.0),
   helpstring("Dispatch interface for Office2000ComAddIn Object"),
   dual,
   oleautomation
 ]  
interface IDTExtensibility2: IDispatch
 {
   [id(0x00000001)]
   HRESULT _stdcall OnConnection(
     [in] IDispatch * HostApp,
     [in] long ext_ConnectMode,
     [in] IDispatch * AddInInst,
     [in] SAFEARRAY(VARIANT) * custom );
   [id(0x00000002)]
   HRESULT _stdcall OnDisconnection([in] long ext_DisconnectMode,
     [in] SAFEARRAY(VARIANT) * custom );
   [id(0x00000003)]
   HRESULT _stdcall OnAddInsUpdate(
     [in] SAFEARRAY(VARIANT) * custom );
   [id(0x00000004)]
   HRESULT _stdcall OnStartupComplete(
     [in] SAFEARRAY(VARIANT) * custom );
   [id(0x00000005)]
   HRESULT _stdcall BeginShutdown(
     [in] SAFEARRAY(VARIANT) * custom );
 };  

Если вы назвали свой класс не DTExtensibility2, а как-то иначе — скорректируйте
название интерфейса. Все остальное, включая uuid, должно быть введено точно
так, как это было описано выше.

Если все введено правильно — в окне Type Library Editor вы должны увидеть пять
методов созданного интерфейса.

Нажмите кнопку «Обновить» и закройте
редактор библиотеки типов — больше он нам
не понадобится. Теперь
откомпилируйте полученный проект и
зарегистрируйте его в Windows при помощи меню
Run->Register COM Server.

При
помощи редактора реестра создайте в
реестре Windows запись для регистрации Add-In с
приложением Microsoft Office. COM Add-In готов!

Отладка модулей расширения

Для работы с модулями расширения
необходимо добавить в меню Microsoft
Office
команду для вызова диспетчера дополнений.
Для этого (на примере Word):

  • В меню Сервис выберите команду Настройка, а затем — вкладку Команды.
  • В списке Категории выберите категорию Сервис.
  • Перетащите команду Надстройки для модели COM… из списка Команды в меню
    Сервис. Когда в меню Сервис раскроется список команд, укажите, где в этом
    меню должна располагаться команда Надстройки для модели COM…, после чего
    отпустите кнопку мыши.
  • Нажмите кнопку «Закрыть».

При помощи этой команды вызывается окно диспетчера дополнений. Загруженные
дополнения помечены в списке галочкой. Чтобы загрузить надстройку — отметьте
ее и нажмите OK, чтобы выгрузить — снимите отметку.

!Если во время загрузки Add-In произошла ошибка — Office не будет загружать
его при следующем запуске приложения автоматически. Чтобы надстройка снова начала
загружаться — загрузите ее через диспетчер.

Для отладки Com Add-Ins установите в качестве Host Application (меню Run —
> Parameters) приложение Office, к которому подключена надстройка, например
WinWord.exe. После этого установите точку прерывания в одном из методов своего
объекта и запустите приложение. Загрузится Word, и при попадании на точку прерывания
вы окажетесь в отладчике Delphi.

Реализуем функциональность

В
настоящий момент наш Add In умеет только
загружаться, но не может сделать ничего
полезного. Для
примера реализации функциональности
добавим на панель инструментов Office
кнопку, по нажатии которой в текущую
позицию курсора будет вставляться список
файлов выбранной папки.

Для этого дополним наш объект
автоматизации несколькими полями и
методами.

type
     TDirectoryList = class(TAutoObject, IDTExtensibility2)
     private
       Host: WordApplication;
       FButtonEventsSink: TCommandButtonEventSink;
       procedure ButtonClick(Button: CommandBarButton;
         var CancelDefault: WordBool);
     protected
       // Реализация IDTExtensibility2
       procedure BeginShutdown(var custom: PSafeArray); safecall;
       procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
       procedure OnConnection(const HostApp: IDispatch;
         ext_ConnectMode: Integer; const AddInInst: IDispatch;
         var custom: PSafeArray); safecall;
       procedure OnDisconnection(ext_DisconnectMode: Integer;
         var custom: PSafeArray); safecall;
       procedure OnStartupComplete(var custom: PSafeArray); safecall;
     end; 

Поле Host будет хранить ссылку на интерфейс WordApplication, необходимый для
работы с объектной моделью Word, поле FButtonEventsSink — ссылку на объект-обработчик
событий от кнопки, реализация которого была рассмотрена в разделе «Обработчик
событий от CommandBarButton», а метод ButtonClick будет вызываться для обработки
нажатия на кнопку.

Реализуем необходимую функциональность
в методах класса TDirectoryList.

const
     // Уникальный идентификатор кнопки. Можно задать любую уникальную
     // строку. Для ее генерации удобно воспользоваться средствами
     // Delphi по генерации GUID (Ctrl+Shift+G)
     // Этот идентификатор понадобится нам для того, чтобы после
     // создания кнопки иметь возможность ее найти.
     BUTTON_TAG = '{1A1552DC-9286-11D3-BCA0-00902759A497}';
   
 
procedure TDirectoryList.OnConnection(const HostApp: IDispatch;
   ext_ConnectMode: Integer; const AddInInst: IDispatch;
   var custom: PSafeArray);
 var
   Bar: CommandBar;
   Button: CommandBarButton;
 begin
   // Сохраняем ссылку на WordApplication для
   // последующей работы с ней
   Host := HostApp as WordApplication;
   // Создаем обработчик событий для кнопки
   FButtonEventsSink := TCommandButtonEventSink.Create;
   FButtonEventsSink.OnClick := ButtonClick;
   // Получаем интерфейс панели инструментов "Форматирование"
   Bar := Host.CommandBars.Get_Item('Formatting');
   // Проверяем наличие на ней нашей кнопки
   Button := Bar.FindControl(msoControlButton, EmptyParam, BUTTON_TAG,
     EmptyParam, msoFalse) as CommandBarButton;;
   if not Assigned(Button) then
     // Если ее нет – создаем
     Button := Bar.Controls.Add(msoControlButton, EmptyParam,
       BUTTON_TAG, 1, EmptyParam) as CommandBarButton;
   // Подключаем обработчик и устанавливаем свойства кнопки
   FButtonEventsSink.Connect(Button);
   Button.Set_Style(msoButtonCaption);
   Button.Set_Tag(BUTTON_TAG);
   Button.Set_Caption('Dir');
 end;  
   
procedure TDirectoryList.OnDisconnection(ext_DisconnectMode: Integer;
   var custom: PSafeArray);
 var
   Bar: CommandBar;
   B: CommandBarControl;
 begin
   // Уничтожаем обработчик событий кнопки
   FreeAndNil(FButtonEventsSink);
   // Ищем свою кнопку
   Bar := Host.CommandBars.Get_Item('Formatting');
   B := Bar.FindControl(msoControlButton, EmptyParam, BUTTON_TAG,
     EmptyParam, msoFalse) as CommandBarButton;
   // И удаляем ее
   if Assigned(B) then
     B.Delete(msoFalse);
 end;  
   
procedure TDirectoryList.ButtonClick(Button: CommandBarButton;
   var CancelDefault: WordBool);
 var
   S: String;
   SR: TSearchRec;
   D: WordDocument;
   FindStatus: Integer;
 begin
   // Эта процедура вызывается при нажатии на созданную нами кнопку
   D := Host.ActiveDocument;
   // Проверяем наличие активного документа
   if Assigned(D) then begin
     // Функция BrowseForFolder возвращает путь к выбранной
     // в диалоге папке. Код функции приведен в модуле с примером
     // на сопровождающем диске. От использования аналогичной
     // функции VCL SelectDirectory пришлось отказаться, так как
     // модуль, в котором она находится, использует Forms
     if BrowseForFolder(S) then begin
       with TStringList.Create do
       try
         // Получаем список файлов
         FindStatus := FindFirst(S + '*.*', 0, SR);
         while FindStatus = 0 do begin
           Add(SR.Name);
           FindStatus := FindNext(SR);
         end;
         FindClose(SR);
         // И вставляем его в документ
         D.ActiveWindow.Selection.InsertAfter(S+#13#13+Text);
       finally
         // Освобождаем TStringList
         Free;
       end;
     end;
   end;
 end;  

Пример работы этой надстройки изображен на рисунке.

Написание надстроек, работающих с несколькими приложениями Office

Поскольку все приложения Office
реализуют одну и ту же модель COM
Add-Ins,
одно и то же расширение может быть
зарегистрировано одновременно для
нескольких приложений. В этом
случае оно должно определять, из какого
приложения оно загружено, и использовать
соответствующую объектную модель.
Определить приложение-владельца можно,
запросив у него соответствующий интерфейс:

procedure TDirectoryList.OnConnection(const HostApp: IDispatch;
   ext_ConnectMode: Integer; const AddInInst: IDispatch;
   var custom: PSafeArray);
 begin
   if HostApp is WordApplication then
   // Это Microsoft Word  

Также возможно сохранение HostApp
в переменной типа Variant
и использование позднего связывания. В
этом случае надстройка будет работать с
любым приложением Office, имеющим подходящие
по именам методы.

КомпьютерПресс 7’2001

  1. В меню Сервис выберите команду Настройка.
  2. Откройте вкладку Команды.
  3. На вкладке Команды в списке Категории выберите пункт Сервис.
  4. Перетащите команду надстроек COM на панель инструментов.
  5. Нажмите кнопку Закрыть, чтобы закрыть диалоговое окно Настройка.
  6. Нажмите кнопку Надстройки COM, чтобы просмотреть список надстроек COM, загруженных в Word.

Если в окне Надстройки COM содержатся надстройки, временно отключите каждую из них. Для этого снимите флажки всех надстроек COM и нажмите кнопку OK. При повторном запуске Word отключенные надстройки COM не будут загружены.

Если проблема устранена после отключения надстроек COM, то одна из этих надстроек COM является причиной проблемы. Если в списке присутствует несколько надстроек COM, необходимо определить, какая из них вызывает рассматриваемую ошибку. Для этого включайте надстройки COM по одной с последующим перезапуском приложения Word.

Надстройками для модели компонентных объектов называются исполняемые файлы (.exe) или файлы библиотек динамической компоновки (.dll), которые обеспечивают дополнительные возможности в Microsoft Outlook. Широкий набор надстроек для модели компонентных объектов и других программных расширений можно найти на web-узле Microsoft Office. При наличии доступа к Интернету выберите в меню Microsoft Outlook Справка команду Office в Интернете.

Надстройки клиента Microsoft Exchange

Надстройками клиента Microsoft Exchange называются файлы настройки расширений (.ecf), обеспечивающие работу дополнительных функций Microsoft Outlook. Эти надстройки автоматически устанавливаются при установке Microsoft Outlook. Если по какой-либо причине одна из этих надстроек удалена или требуется установить надстройку стороннего поставщика, это можно сделать в любое время. В следующей таблице приведены описания надстроек, имеющихся в Microsoft Outlook.

Имя файла Описание
Dlgsetp.ecf Доступ представителей. Добавление вкладки Представители в диалоговом окне Параметры (меню Сервис).
Dumpster.ecf Восстановление удаленных элементов. Добавление возможности восстановления удаленных элементов.
Outex2.ecf Расширения Microsoft Exchange. Добавление команды Заместитель (меню Сервис).
Minet.ecf Почта Интернета. Добавление вкладки Интернет в диалоговом окне Свойства сообщения.
Mail3.ecf Расширения Mail 3.0. Включение в Microsoft Outlook расширений, созданных для Microsoft Mail версии 3.0.
Awfext.ecf Microsoft Fax. Если ранее была выполнена настройка программы Microsoft At Work, она добавляется в список доступных информационных служб.
Msfsmenu.ecf Расширения меню Microsoft Mail 3.x. Включение в Microsoft Outlook расширений меню, созданных для Microsoft Mail 3.x.
Msfsprop.ecf Расширения окна свойств Microsoft Mail 3.x. Включение в Microsoft Outlook расширений диалоговых окон, созданных для Microsoft Mail 3.x.
Outex.ecf Расширения для удаленной работы Microsoft Exchange. Добавление параметров удаленной почты в окно Почта (панель управления Microsoft Windows).
Msspc.ecf Schedule+. Обеспечение совместимости с Microsoft Schedule+.
Msn.ecf Microsoft Network. Добавление MSN в список доступных информационных служб.
Pmailext.ecf Поддержка Microsoft Windows CE. Добавление поддержки переноса в папку «Входящие» Microsoft Windows CE.
Scrpxtn.ecf Поддержка сценариев. Включение агентов сценариев Microsoft Exchange Server.
Faxext.ecf Расширения Microsoft Fax. Включение расширений, созданных для Microsoft Fax.
Ccmxp.ecf Расширения меню Lotus cc:Mail. Включение расширений меню для Lotus cc:Mail.
Cserve.ecf CompuServe. Обеспечение совместимости со службами CompuServe.
Fldpub.ecf Публикация папок. Включение публикации папок в Интернете.
Mtmolmnu.ecf Диспетчер групп. Добавление поддержки диспетчера групп.
Olmenu.ecf Форма TeamStatus. Добавление формы TeamStatus.
Rwizi.ecf Мастер правил. Включение мастера правил.

Добавление или удаление надстройки

  • Добавление или удаление надстройки COM.
    1. В меню Сервис выберите команду Параметры, а затем – вкладку Дополнительно.
    2. Нажмите кнопку «Дополнительные параметры», а затем – кнопку «COM-надстройки».
    3. Чтобы включить надстройку, установите флажок рядом с ее названием.
    4. Если необходимой надстройки COM нет в списке, ее необходимо добавить в Список надстроек. Нажмите кнопку «Добавить», выделите необходимую надстройку (файл .exe или .dll) и нажмите кнопку «OK».
    5. Чтобы отключить надстройку, снимите флажок рядом с ее названием.
    6. Чтобы удалить надстройку, снимите флажок рядом с ее названием и нажмите кнопку «Удалить».
  • Добавление или удаление надстройки клиента Microsoft Exchange.
    1. В меню Сервис выберите команду Параметры, а затем – вкладку Дополнительно.
    2. Нажмите кнопку «Дополнительные параметры», а затем – кнопку «Приложения».
    3. Нажмите кнопку «Установить» и дважды щелкните необходимый файл конфигурации расширений (.ecf).
    4. Нажмите кнопку «OK».
    5. Чтобы отключить надстройку, снимите флажок рядом с ее названием и нажмите кнопку «OK».
  • Download source files — 177 Kb
  • Download demo files — 353 Kb

Sample image

Introduction

In this article, we will learn how to create a simple Hello World browser add-in for Microsoft’s applications that supports add-in. A list of such applications is given here:

  1. Microsoft Word
  2. Microsoft VSMacros IDE
  3. Microsoft Visual Studio .NET
  4. Microsoft Visio
  5. Microsoft Publisher
  6. Microsoft Project
  7. Microsoft PowerPoint
  8. Microsoft Outlook
  9. Microsoft FrontPage
  10. Microsoft Excel
  11. Microsoft Access

In this article, we will take Microsoft Outlook as an example.

Prerequisites:

You must have the following …

  1. Microsoft Development Environment 2003 or higher
  2. Microsoft .NET Framework 2.0
  3. Office Primary Interop Assemblies (PIAs). For Office XP, click here to download.

Creating the Add-in

  • Run the Microsoft Development Environment.
  • Go to File> New Project>, a dialog will appear.
  • Go to Other Projects> Extensibility Project, select Shared Add-in type project template.

Add-In Wizard

When the Add-in wizard starts, press Next…

Sample image

Select programming language (example C#), press Next.

Sample image

Select applications in which you want to host your add-in, press Next.

Sample image

Provide add-in name and description, press Next.

Sample image

Choose add-in options, press Next.

Sample image

Press Finish.

Sample image

Setup Projects

Two projects will be added automatically.

  1. Add-in project.
  2. Setup project.

Creating the Browser Form

  1. Add a form for the Add-in project, named frmHelloWorld.cs.
  2. Add a Label, TextBox, and a PictureBox.
  3. Add a Microsoft web browser control to the form (you can get it by right clicking on the toolbox, selecting Add/Remove Items, and clicking on the “COM Components”: a lot of controls will be listed, select Microsoft Web Browser Control, and press OK.
  4. With the following code, create a function go():
void go()
{
    try
    {
        stbPanel1.Text="Trying to open "+tbURL+"..." ;
        object obj=new object ();
        browser.Navigate(tbURL.Text,ref obj,ref obj,ref obj,ref obj);
    }
    catch(Exception ex)
    {
        
    }
}

Call this function on the PictureBox‘s Click event.

Programming for Add-in Connection

Install PIAs and add a reference to the following DLL: Microsoft.Office.Interop.Outlook.DLL.

Sample image

There will be a file connect.cs in the add-in project, open it. Declare the following items globally:

private Microsoft.Office.Interop.Outlook.Application applicationObject; 
private object addInInstance; 
private CommandBarButton btnLaunch;

In the function OnStartupComplete, write the following code:

public void OnStartupComplete(ref System.Array custom)
{
    CommandBars commandBars = 
        applicationObject.ActiveExplorer().CommandBars;

    try
    {
        
               btnLaunch= (CommandBarButton)
            commandBars["Standard"].Controls["HelloWorld"];
    }
    catch
    {
        
                 btnLaunch = (CommandBarButton)
            commandBars["Standard"].Controls.Add(1, 
            System.Reflection.Missing.Value, 
            System.Reflection.Missing.Value, 
            System.Reflection.Missing.Value, 
            System.Reflection.Missing.Value);
        btnLaunch.Caption = "Hello World Browser!";
        btnLaunch.Style = MsoButtonStyle.msoButtonCaption;
    }
    
    btnLaunch.Tag = "This is Hello World Browser!";


    btnLaunch.OnAction = "!<EMAILSTATSADDIN.CONNECT>";
    btnLaunch.Visible = true;
    btnLaunch.Click += new 
        _CommandBarButtonEvents_ClickEventHandler(
        btnLaunch_Click);
}

In the function OnBeginShutdown, write the following code:

public void OnBeginShutdown(ref System.Array custom)
{
    
    CommandBars commandBars = applicationObject.ActiveExplorer().CommandBars;
    try
    {
        
        commandBars["Standard"].Controls["HelloWorld"].Delete(
                             System.Reflection.Missing.Value);
    }
    catch(System.Exception ex)
    {
        
    }
}

Write the following code in the btnLanuch event handler:

private void btnLaunch_Click(CommandBarButton Ctrl, 
                            ref bool CancelDefault)
{
    try
    {
        frmHelloWorld objfrmHelloWorld=new frmHelloWorld ();
        objfrmHelloWorld.Show();  
    }
    catch(Exception ex)
    {
        
    }
}

Rebuild and Installation

Right click on the setup project, click Rebuild, and it will automatically rebuild the add-in and the setup project. Then, right click on the setup project and click Install.

Running

Run Microsoft Outlook, and you will see “Hello World Browser!” on the toolbar. Click on it and your add-in will start. As you can see here…

Sample image

Known Issues

After uninstallation, the “Hello World Browser!” button is not removed from the Outlook toolbar.

Like this post? Please share to your friends:
  • Надстроек com в word
  • Надпись под рисунком word
  • Надпись по центру word
  • Надпись по вертикали в word
  • Надпись осей в excel