以下代码来自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);
}
}
答案 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
数据类型。班级 管理资源分配和释放并进行函数调用 1}}和VariantInit
视情况而定。
构造函数有多种变体,它们使用不同的参数类型并创建适当类型的VariantClear
对象。对于标准Windows API UNICODE或VARIANT
字符串,您需要使用wchar_t
对象。
ATL提供BSTR
,MFC提供用于包装CComVariant
的{{1}}类。这三个包装类(COleVariant
,VARIANT
和_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 Class的VARIANT
的这条说明:
此类派生自VARIANT结构。这意味着你可以 在一个调用VARIANT的参数中传递一个COleVariant VARIANT结构的数据成员是可访问的数据成员 COleVariant。