我在COM exe进程中运行代码。具体来说,我有一个可在任何Office产品中运行的插件。
我的代码有一个明确赋予它的IDispatch*
。具体来说,我通过IDispatch*
的实施获得了_IDTExtensibility2::OnConnection
。
我收到的IDispatch*
是特定coclass的接口,该coclass 不 coclass,其标有[appobject]
IDL属性。具体来说,接口是名为Application
的coclass(所有Office产品中的同名),但任何Office产品类型库中标记为[appobject]
的coclass都称为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);
...
}
因此,我可以获取Application类及其包含类型库的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以查找具有[appobject]
属性的coclass。但是,一旦我获得该{coclass ITypeInfo*
,我就不知道如何处理它。如果我在其上调用CreateInstance
,则按照通常的COM激活规则启动新进程。
如何向此IDispatch*
实例获取[appobject]
?