0

我想将 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 方法,但它在调用后给出了访问冲突。我做错了什么?

4

1 回答 1

1

如果你想使用VARIANT原始结构,你可以这样编码:

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_tCComVariant (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

于 2019-03-16T14:29:55.740 回答