Получение экземпляра appobject изнутри запущенного COM exe (Office)

У меня есть код, запущенный в процессе 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] пример?

1

Решение

Задача ещё не решена.

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


По вопросам рекламы [email protected]