Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将com实例转换为变量,并在idispach调用中传递它_C++_Com_Activex_Variant_Idispatch - Fatal编程技术网

C++ 如何将com实例转换为变量,并在idispach调用中传递它

C++ 如何将com实例转换为变量,并在idispach调用中传递它,c++,com,activex,variant,idispatch,C++,Com,Activex,Variant,Idispatch,我想将com对象实例作为变量参数传递给另一个活动的x对象函数,为此我需要将idispatch指针转换为变量?我不确定 hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); if (FAILED(hr)) { return; } hr = CLSIDFromProgID(objectName.c_str(), &clsid); if (FAILED(hr)) {

我想将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();
IDispatch *pApp = ...

// both wrappers will call appropriate methods
// and will release what must be, when destroyed
CComVariant cv = pApp;

// or

_variant_t vt = pApp;
或者,如果您使用的是VisualStudio开发环境,那么您可以使用我推荐的Or(ATL)智能包装器。在这种情况下,您可以这样称呼它:

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();
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
,否则,例如
\u variant

不要使用
ppdisVal
。另外,当您将
变量
包装在其周围时,可能需要调用
pApp.AddRef()
。因为将来对
VariantClear
的调用将最终调用
pdispVal->Release()
。使用变体的最佳方式是使用Visual Studio环境提供的智能包装器,如
\u variant\t
CComVariant
。使用这些包装器,您可以只使用相等运算符。好的,有任何参考吗?我会试着自己做的,想想atl,对吗?我不能使用ATL。你使用Visual Studio吗?如果是,则变量需要comdef.h,否则CComVariant需要atlcom.hyes!我让它工作了!顺便说一句,使用_variant并删除ppdisVal用法,我也无法从GetIDsOfNames中抛出的变量异常调用函数