【发布时间】:2015-01-16 08:26:57
【问题描述】:
我正在尝试构建一个 ATL COM 类,它具有以下方法:
STDMETHODIMP CTestClass::TestMethod(VARIANT VarIn, VARIANT_BOOL* bRes)
{
//VarIn is of type VT_INT
CComVariant var(VarIn);
var.ChangeType(VT_UI8); //doesn't work, HRESULT return value reports type mismatch
ULONGLONG ullVal = var.ullVal; //wrong value is assigned
*bRes = VARIANT_TRUE;
return S_OK;
}
问题在于CComVariant 实例的类型在方法内部 没有改变。例如,如果我将基于 int 的值 123 传递给上述方法,则不会执行到 VT_UI8 的类型转换。
但是,如果 CComVariant 类用于独立函数中,则通过 ChangeType() 方法更改类型完美无缺:
void Function()
{
CComVariant var(123);
var.ChangeType(VT_UI8); //ok
ULONGLONG ullVal = var.ullVal; //correct value is assigned
}
有什么我忽略的吗?谢谢。
【问题讨论】:
-
您按值传递它。所以当然调用者的变体不会改变。
-
@HansPassant 我不想将变体传递回调用者,这就是我按值传递它的原因。相反,我想在 ATL 方法中更改
CComVariant实例的类型。这将允许我将其值分配给一个新的 ULONGLONG 变量。 -
Q 缺少细节。如果您想在返回后转换值,请参阅 Hans 上面的评论。如果您有转换失败,您必须提及输入变量值并检查
ChangeType调用返回的值。