У меня есть код, запущенный в процессе COM-EXE. В частности, у меня есть надстройка, которая работает в любом продукте Office.
Мой код имеет IDispatch*
это явно дано ему. В частности, мне дают IDispatch*
через мою реализацию _IDTExtensibility2::OnConnection
,
IDispatch*
Я получаю интерфейс для определенного Coclass не кокласс, который отмечен [appobject]
Атрибут IDL. В частности, интерфейс для Coclass называется Application
(то же самое имя во всех продуктах Office), но отмечен кокласс [appobject]
внутри любого продукта Office называется typelib Global
,
Из этого процесса есть ли способ получить единичный экземпляр [appobject]
CoClass? Вот что я пробовал до сих пор:
STDMETHODIMP Addin::OnConnection(LPDISPATCH application, ext_ConnectMode connectMode, LPDISPATCH addInInst, SAFEARRAY** custom)
{
// get type info of Application object
ITypeInfoPtr typeInfoPtr;
application->GetTypeInfo(0, LOCALE_USER_DEFAULT, &typeInfoPtr);
// get type lib of Office product
ITypeLibPtr typeLibPtr;
UINT typeInfoIndex;
typeInfoPtr->GetContainingTypeLib(&typeLibPtr, &typeInfoIndex);
...
}
Так что я могу получить ITypeInfo*
а также ITypeLib*
для класса приложения и содержащей его библиотеки типов. Я знаю, что могу использовать ITypeComp*
привязать к глобальным функциям / переменным с помощью ITypeComp*
вернулся из ITypeLib::GetTypeComp
, Что-то вроде этого:
// get type comp for the typelib
ITypeCompPtr typeCompPtr;
typeLibPtr->GetTypeComp(&typeCompPtr);
// bind to global property-get function "Application"ITypeInfoPtr boundTypeInfoPtr;
DESCKIND descKind;
BINDPTR bindPtr;
ULONG hash = LHashValOfNameSys(SYS_WIN32, LOCALE_USER_DEFAULT, L"Application");
typeCompPtr->Bind(L"Application", hash, INVOKE_PROPERTYGET, &boundTypeInfoPtr, &descKind, &bindPtr);
...
Однако это для позднего связывания этих вызовов функций / переменных. Я действительно хочу выполнить раннее связывание — у меня есть необходимые DISPID. Что у меня нет, так это IDispatch*
в единственном экземпляре [appobject]
учебный класс.
Кроме того, я могу сканировать тип lib для Coclass, который имеет [appobject]
приписывать. Однако, как только я получу ITypeInfo*
для этого класса я не знаю, что с ним делать. Если я позвоню CreateInstance
на нем новый процесс запускается согласно обычным правилам активации COM.
Как я могу получить IDispatch*
к этому [appobject]
пример?
Задача ещё не решена.