如何将COM实例转换为变体,以将其传递给IDISPACH INDOKE

how to convert com instance to variant, to pass it in idispach invoke

本文关键字:INDOKE IDISPACH COM 实例 转换      更新时间:2023-10-16

我想将com对象实例作为变体参数传递给另一个活动x对象函数,因为我需要将idispatch指针转换为变体?我不确定。

hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    if (FAILED(hr))
    { 
        return;
    }
    hr = CLSIDFromProgID(objectName.c_str(), &clsid);
    if (FAILED(hr))
    {
        return;
    }
    hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pApp));
    if (FAILED(hr) || pApp == nullptr) {
        return;
    }

这是创建代码的实例,之后我正在使用:

VARIANT v;
    VariantInit(&v);
    v.pdispVal = pApp;
    v.ppdispVal = &pApp;
    v.vt = VT_DISPATCH;
    return v;

并将其传递给一个活动X方法,但是在调用后它给出了访问违规。我做错了什么?

如果要使用变体原始结构,则可以像这样编码:

VARIANT v;
VariantInit(&v);
pApp->AddRef();
v.pdispVal = pApp;
v.vt = VT_DISPATCH;
...
// later on, some code (this code or another code) will/should call this
VariantClear(&v); // implicitely calls pdispVal->Release();

或,如果您使用的是Visual Studio开发环境,则可以使用我建议的_variant_t或ccomvariant(ATL)智能包装器。在这种情况下,您可以这样称呼它:

IDispatch *pApp = ...
// both wrappers will call appropriate methods
// and will release what must be, when destroyed
CComVariant cv = pApp;
// or
_variant_t vt = pApp;

ps:不要使用包装器类,做出选择。如果一个项目使用ATL,我使用CComVariant,否则_variant_t,例如。