更改 CComVariant 变量的类型在 ATL 方法中不起作用
Changing type of CComVariant variable doesn't work inside ATL method
我正在尝试构建一个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
}
我忽略了什么吗?谢谢。
你的测试代码应该是这样的:
CComVariant v;
v.vt = VT_INT;
v.intVal = 123;
const HRESULT n = v.ChangeType(VT_UI8); // 0x80020005 DISP_E_TYPEMISMATCH Type mismatch.
ChangeType
由VariantChangeType
API提供支持,该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,
延伸阅读:
- 关于油VT_INT的问题32
- COM 自动化接口中允许的"out"参数类型
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 我有一个启用了代理存根支持的 ATL 项目,在哪里可以找到 xdlldata.h 文件中所有方法的实现
- 删除/编辑 ATL COM DLL 属性/方法
- 可视化 如何删除 ATL COM C++中的方法
- 使用 ATL 编译 dll,并将方法参数作为接口,但将它们作为 coclass 获取
- 更改 CComVariant 变量的类型在 ATL 方法中不起作用
- ATL/COM对象的方法:在VBA for excel中调用它,而不是在c#中调用它
- ATL COM dll中调用了错误的方法
- 在ATL项目中将NULL指针传递给进程外COM方法的正确方法
- 保持ATL服务运行的最佳方法是什么?