从正在运行的COM exe(Office)中获取appobject实例

时间:2014-07-02 19:00:26

标签: c++ com automation ms-office typelib

我在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]

0 个答案:

没有答案