以下代码来自MSDN源代码示例,我有一个问题。
为什么我们需要使用多个VARIANT result;
定义来定义不同的变量?我们可以以更短的方式初始化不同类型的VARIANT
变量(主要是整数和字符串)吗?简洁安全的方法。
另外,是否可以将VariantInit(&result)
替换为result.vt = VT_EMPTY
以仅将VARIANT
标记为空?
int main()
{
//blahblahbla
{
VARIANT x;
x.vt = VT_R4; // 4-byte real.
x.fltVal = 1.2f;
wprintf(L"Set FloatProperty = %.2fn", x.fltVal);
hr = AutoWrap(DISPATCH_PROPERTYPUT, NULL, pSimpleObj, L"FloatProperty", 1, x);
}
{
VARIANT result;
VariantInit(&result);
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pSimpleObj, L"FloatProperty", 0);
wprintf(L"Get FloatProperty = %.2fn", result.fltVal);
}
{
VARIANT result;
VariantInit(&result);
hr = AutoWrap(DISPATCH_METHOD, &result, pSimpleObj, L"HelloWorld", 0);
wprintf(L"Call HelloWorld => %sn", result.bstrVal);
VariantClear(&result);
}
}
为什么我们需要使用不同的"变量结果"变量?
您不必这样做,这只是示例的编写方式。 重用 VARIANT 变量时要小心,仅仅调用 VariantInit() 或赋值 result.vt = VT_EMPTY 是危险的。 变体可以存储需要释放的资源。 如代码片段中所做的那样,请注意对 VariantClear() 的调用,这是释放 BSTR 所必需的。 这与 VariantInit() 不同,VariantClear 在再次初始化变体之前先释放资源。
另请注意在DISPATCH_PROPERTYGET调用后如何省略它。 没关系,但你必须知道你在做什么。 在这种情况下没问题,因为 VARIANT 可以存储浮点值,而无需为其分配内存。 无论如何调用 VariantClear() 肯定没有错。
请记住,MSDN 源代码通常编写为使用 C 编译器进行编译。 如果你写COM代码,那么你几乎总是倾向于使用C++。 这当然可以更好地工作,您现在可以使用_variant_t类。 一个包装类,它避免了愚蠢的错误,并使语法更清晰,这是您所要求的。 您不再需要使用VariantInit或VariantClear,包装器会为您完成此操作,并且永远不会出错。
直接使用 VARIANT
的替代方法是改用 C++ 中可用的包装类之一。有几种替代方法,具体取决于您使用的是 MFC 还是 ATL 或仅使用本机C++。
对于简单的包装器,有 _variant_t
类,它提供了一些基本功能,特别是对于简单的数据,如整数和字符串。该类不直接支持SAFEARRAY
类型 VARIANTS
。
请参阅Microsoft开发人员网络主题_variant_t类,其中概述了包装类和可用方法。
_variant_t
对象封装VARIANT
数据类型。该类 管理资源分配和解除分配并进行函数调用 酌情VariantInit
和VariantClear
。
构造函数有多种变体,采用不同的参数类型并创建适当类型的VARIANT
对象。看起来对于标准的Windows API UNICODE或wchar_t
字符串,您将需要使用BSTR
对象。
ATL 提供CComVariant
,MFC 提供用于包装VARIANT
的COleVariant
类。这三个包装类(_variant_t
、CComVariant
和COleVariant
似乎都派生自VARIANT
的底层数据结构struct tagVARIANT
,所以所有这些似乎都可用于任何使用VARIANT
的接口。
此说明来自Microsoft开发人员网络 CComVariant 类CComVariant
CComVariant 包装了 VARIANT 和 VARIANTARG 类型,它由 联合和指示存储在 联盟。VARIANT通常用于自动化。
CComVariant 派生自 VARIANT 类型,因此它可以在任何地方使用 可以使用变体。例如,您可以使用V_VT宏来 提取 CComVariant 的类型,或者您可以访问 VT 成员 直接就像您可以使用变体一样。
以及来自Microsoft开发者网络 COLEVariant 类的COleVariant
说明:
此类派生自 VARIANT 结构。这意味着您可以 在参数中传递一个 COLEVARIANT ,该参数调用一个 VARIANT 并且 变量结构的数据成员是可访问的数据成员 的科尔变体。