使用VARIANT类型更简洁优雅的方式

时间:2013-10-11 19:27:16

标签: visual-c++ variant

以下代码来自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 = %.2f\n", 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 = %.2f\n", result.fltVal);
    }

    {
        VARIANT result;
        VariantInit(&result);
        hr = AutoWrap(DISPATCH_METHOD, &result, pSimpleObj, L"HelloWorld", 0);
        wprintf(L"Call HelloWorld => %s\n", result.bstrVal);
        VariantClear(&result);
    }
}

2 个答案:

答案 0 :(得分:2)

  

为什么我们需要使用不同的“VARIANT结果”变量?

您没有,这就是样本的编写方式。重新使用VARIANT变量时要小心,只需调用VariantInit()或赋值result.vt = VT_EMPTY是危险的。变体可以存储需要释放的资源。正如在代码片段中所做的那样,请注意释放BSTR所需的VariantClear()调用。与VariantInit()不同,VariantClear在再次初始化变量之前首先释放资源。

还要注意DISPATCH_PROPERTYGET调用后如何省略它。没关系,但你必须知道你在做什么。好的,在这种情况下,因为VARIANT可以存储浮点值而无需为其分配内存。无论如何调用VariantClear()肯定没错。

请记住,MSDN源代码经常被编写为使用C编译器进行编译。如果你编写COM代码,那么你几乎总是喜欢使用C ++。哪个当然可以更好,你现在可以使用_variant_t class。一个包装类,可以避免愚蠢的错误,并使语法更清晰,你要求的。您不再需要使用VariantInit或VariantClear,包装器会为您完成它并且永远不会出错。

答案 1 :(得分:0)

直接使用VARIANT的替代方法是使用C ++提供的其中一个包装类。根据您使用的是MFC还是ATL还是仅使用本机C ++,有几种选择。

对于一个简单的包装器,有_variant_t类,它提供了一些基本的便利设施,特别是对于简单数据,如整数和字符串。该课程不直接支持SAFEARRAY类型VARIANTS

请参阅Microsoft Developer Network topic _variant_t Class,其中提供了包装类和可用方法的概述。

  

_variant_t对象封装了VARIANT数据类型。班级   管理资源分配和释放并进行函数调用   VariantInit视情况而定。

构造函数有多种变体,它们使用不同的参数类型并创建适当类型的VariantClear对象。对于标准Windows API UNICODE或VARIANT字符串,您需要使用wchar_t对象。

ATL提供BSTR,MFC提供用于包装CComVariant的{​​{1}}类。这三个包装类(COleVariantVARIANT_variant_t似乎都来自CComVariant COleVariant的基础数据结构,因此所有这些似乎可用于使用struct tagVARIANT的任何界面。

VARIANT来自Microsoft Developer Network CComVariant Class

的说明
  

CComVariant包含VARIANT和VARIANTARG类型,它由a组成   union和指示存储在数据中的数据类型的成员   联盟。 VARIANT通常用于自动化。

     

CComVariant派生自VARIANT类型,因此可以在任何地方使用   VARIANT可以使用。例如,您可以使用V_VT宏   提取CComVariant的类型,或者您可以访问vt成员   直接就像使用VARIANT一样。

来自Microsoft Developer Network COleVariant ClassVARIANT的这条说明:

  

此类派生自VARIANT结构。这意味着你可以   在一个调用VARIANT的参数中传递一个COleVariant   VARIANT结构的数据成员是可访问的数据成员   COleVariant。