Надстройка Word в C ++, IDTExtensibility2, как написать обработчики для событий? (нужна общая помощь COM)

Я тащусь от очень немногих доступных примеров собственных надстроек Word, пытаясь найти способ реконструировать событие VSTO Document.OnBeforeClose.

В настоящее время я понял, что IDTExtensibility2 имеет ссылку на DTEи что DTE это тот же COM-подход, используемый для расширений Visual Studio. (поэтому, если я найду работающую надстройку VS с написанным на C ++ аналогичным типом хуков, она быстро решит мои проблемы.)

Это было взято из TestAddin2 образец 2000-х годов:

    BEGIN_COM_MAP(CConnect)
COM_INTERFACE_ENTRY2(IDispatch, IRibbonCallback)
COM_INTERFACE_ENTRY(IConnect)
COM_INTERFACE_ENTRY(_IDTExtensibility2)
COM_INTERFACE_ENTRY(_FormRegionStartup)
COM_INTERFACE_ENTRY(IRibbonExtensibility)
COM_INTERFACE_ENTRY(IRibbonCallback)
END_COM_MAP()

Так что в настоящее время мне интересно:

  • Как получить правильные параметры ENTRY * для захвата событий уровня документа из Word?
  • какой интерфейс (ы) должен быть реализован для поддержки этого?
  • как правильно реализовать функции обратного вызова (те, которые передаются в com объект как «обработчики» в VSTO) в чистом C ++ COM?
  • Есть ли что-нибудь для генерации заголовков из существующего COM-объекта, как VS делает при отображении полей / реквизитов COM-объекта?

Похоже, что кому-то на SO удалось написать дополнение к нативному коду (упаковка COM-надстройки для развертывания), поэтому я действительно ожидаю помощи здесь.

2

Решение

Вот пример, иллюстрирующий, как реализовать обработчики событий для COM-интерфейсов с ATL IDispEventImpl/BEGIN_SINK_MAP/SINK_ENTRY_EX/END_SINK_MAP:

http://support.microsoft.com/kb/194179.

Чтобы создать определения COM для MS Word и объектной модели Office, вам понадобятся следующие файлы:

MSADDNDR.TLB
MSO.DLL
MSWORD.OLB
VBE6EXT.OLB

Вы должны быть в состоянии найти их где-нибудь в «C: \ Program Files (x86) \ Microsoft Office \». Следующий код импорта работал у меня некоторое время назад с Office 2007, возможно, вам придется настроить его для более поздних версий Office:

#import "TypeLib\MSADDNDR.TLB" \
raw_interfaces_only \
no_namespace \
auto_search

#import "TypeLib\MSWORD.OLB" \
raw_interfaces_only \
rename("ExitWindows","MsoExitWindows") \
rename("FindText","MsoFindText") \
rename("DocumentProperties", "MsoDocumentProperties") \
rename("RGB", "MsoRGB") \
auto_search \
exclude("IAccessible", "AddIn", "Adjustments")
1

Другие решения

Других решений пока нет …