C++ 更改CComVariant变量的类型不会';不能在ATL方法内工作
我正在尝试构建一个ATL COM类,该类具有以下方法:C++ 更改CComVariant变量的类型不会';不能在ATL方法内工作,c++,com,atl,C++,Com,Atl,我正在尝试构建一个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
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
}
有什么是我忽略的吗?谢谢。您的测试代码应该是这样的:
CComVariant v;
v.vt = VT_INT;
v.intVal = 123;
const HRESULT n = v.ChangeType(VT_UI8); // 0x80020005 DISP_E_TYPEMISMATCH Type mismatch.
ChangeType
由API支持,它
…处理基本类型之间的强制(包括数字到字符串和字符串到数字强制)
然而,问题是定义的“基本”类型太多,有些类型比其他类型“更基本”。例如,VT_I4
优于VT_INT
:
CComVariant v;
v.vt = VT_INT;
v.intVal = 123;
const HRESULT n1 = v.ChangeType(VT_UI8); // 0x80020005 DISP_E_TYPEMISMATCH Type mismatch.
v.vt = VT_I4;
const HRESULT n2 = v.ChangeType(VT_UI8); // S_OK
ULONGLONG n = v.ullVal; // 123
也就是说,API转换似乎不接受VT_INT
。您将更安全地选择此列表顶部的首选类型:
enum VARENUM
{
VT_EMPTY = 0,
VT_NULL = 1,
VT_I2 = 2,
VT_I4 = 3,
VT_R4 = 4,
VT_R8 = 5,
VT_CY = 6,
VT_DATE = 7,
VT_BSTR = 8,
VT_DISPATCH = 9,
VT_ERROR = 10,
VT_BOOL = 11,
VT_VARIANT = 12,
VT_UNKNOWN = 13,
VT_DECIMAL = 14,
VT_I1 = 16,
VT_UI1 = 17,
VT_UI2 = 18,
VT_UI4 = 19,
VT_I8 = 20,
VT_UI8 = 21,
// *** Cut off line ***
VT_INT = 22,
VT_UINT = 23,
进一步阅读:
CComVariant
实例的类型。这将允许我把它的值赋给一个新的ULONGLONG变量。如果您想在返回后转换值,请参阅上面Hans的评论。如果转换失败,则必须提及输入变量值,并检查ChangeType
调用返回的值。谢谢,这很有意义。这是否意味着在处理VT_INT
和VT_INT
类型时,我总是不得不求助于手动转换例程?您可以看到标准API不接受VT_INT
,因此避免这种类型或自行实现转换应该是一个很好的信号。