0

以下代码来自 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);
    }
}
4

2 回答 2

2

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

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

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

请记住,MSDN 源代码通常是用 C 编译器编写的。如果您编写 COM 代码,那么您几乎总是倾向于使用 C++。这当然可以更好地工作,您现在可以使用_variant_t 类。一个包装类,可以避免愚蠢的错误并使语法更清晰,正如您所要求的。您不再需要使用 VariantInit 或 VariantClear,包装器会为您完成它并且永远不会出错。

于 2013-10-11T20:58:41.640 回答
0

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

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

请参阅Microsoft 开发人员网络主题 _variant_t 类,它提供了包装类和可用方法的概述。

_variant_t对象封装了数据VARIANT类型。该类管理资源分配和释放,VariantInitVariantClear在适当的时候调用函数。

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

ATL 提供CComVariant和 MFC 提供COleVariant用于包装的类VARIANT。这三个包装类(_variant_t、、CComVariantCOleVariant所有似乎都派生自struct tagVARIANT的底层数据结构VARIANT,因此所有这些似乎都可用于使用 的任何接口VARIANT

此注释CComVariant来自Microsoft Developer Network CComVariant 类

CComVariant 包装了 VARIANT 和 VARIANTARG 类型,它由一个 union 和一个成员组成,该成员指示存储在 union 中的数据的类型。VARIANT 通常用于自动化。

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

COleVariant以及来自Microsoft Developer Network COleVariant Class的注释:

该类派生自 VARIANT 结构。这意味着您可以在调用 VARIANT 的参数中传递 COleVariant,并且 VARIANT 结构的数据成员是 COleVariant 的可访问数据成员。

于 2016-09-05T22:18:56.897 回答