如何将 com 实例转换为变体,以在 idispach 调用中传递它
how to convert com instance to variant, to pass it in idispach invoke
我想将 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原始结构,你可以这样编码:
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 or 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:不要使用 both 包装器 类,请自行选择。如果一个项目使用ATL,我使用CComVariant
,否则_variant_t
,例如
我想将 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原始结构,你可以这样编码:
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 or 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:不要使用 both 包装器 类,请自行选择。如果一个项目使用ATL,我使用CComVariant
,否则_variant_t
,例如