最近在调试代码时,发现代码中在进行赋值或相等判断时,不少直接采用赋值操作符=、相等判断==进行处理,但实际上,这样做是存在风险的。
Variant拷贝请使用VariantCopy或直接采用CComVariant的赋值运算符、Copy方法,慎用Variant的=操作符
#include <iostream>
#include<variant>
#include<OAIdl.h>
#include<mbstring.h>
#include <comdef.h>
#include <atlbase.h>
using namespace std;
CComVariant GetVariantFromVariant1()
{
CComVariant varNew;
CComVariant varOld;
VariantInit(&varNew);
VariantInit(&varOld);
varOld.vt = VT_BSTR;
varOld.bstrVal = ::SysAllocString(L"Welcome to China!\n");
string str = _com_util::ConvertBSTRToString(varOld.bstrVal);
std::cout << str;
VariantClear(&varNew);
varNew.Copy(&varOld) ; //CComVariant的Copy方法,实现CComVariant的拷贝
VariantClear(&varOld);
varOld.bstrVal = ::SysAllocString(L"Welcome to Hubei!\n");
return varNew;
}
CComVariant GetVariantFromVariant2()
{
CComVariant varNew;
CComVariant varOld;
VariantInit(&varNew);
VariantInit(&varOld);
varOld.vt = VT_BSTR;
varOld.bstrVal = ::SysAllocString(L"Welcome to China!\n");
string str = _com_util::ConvertBSTRToString(varOld.bstrVal);
std::cout << str;
VariantClear(&varNew);
varNew = varOld; //CComVariant的赋值运算符,实际是调用的::VariantCopy(this, const_cast<VARIANT*>(pSrc));
VariantClear(&varOld);
varOld.bstrVal = ::SysAllocString(L"Welcome to Hubei!\n");
return varNew;
}
VARIANT GetVariantFromVariant3()
{
VARIANT varNew;
VARIANT varOld;
VariantInit(&varNew);
VariantInit(&varOld);
varOld.vt = VT_BSTR;
varOld.bstrVal = ::SysAllocString(L"Welcome to China!\n");
string str = _com_util::ConvertBSTRToString(varOld.bstrVal);
std::cout << str;
VariantClear(&varNew);
varNew = varOld; //错误的Variant拷贝
VariantClear(&varOld);
varOld.bstrVal = ::SysAllocString(L"Welcome to Hubei!\n");
return varNew;
}
VARIANT GetVariantFromVariant4()
{
VARIANT varNew;
VARIANT varOld;
VariantInit(&varNew);
VariantInit(&varOld);
varOld.vt = VT_BSTR;
varOld.bstrVal = ::SysAllocString(L"Welcome to China!\n");
string str = _com_util::ConvertBSTRToString(varOld.bstrVal);
std::cout << str;
VariantCopy(&varNew, &varOld); //正确的Variant拷贝
VariantClear(&varOld);
varOld.bstrVal = ::SysAllocString(L"Welcome to Hubei!\n");
return varNew;
}
int main()
{
CComVariant var1 = GetVariantFromVariant1();
string str1 = _com_util::ConvertBSTRToString(var1.bstrVal);
std::cout << str1;
CComVariant var2 = GetVariantFromVariant2();
string str2 = _com_util::ConvertBSTRToString(var2.bstrVal);
std::cout << str2;
VARIANT var3 = GetVariantFromVariant3();
string str3 = _com_util::ConvertBSTRToString(var3.bstrVal);
std::cout << str3;
VARIANT var4 = GetVariantFromVariant4();
string str4 = _com_util::ConvertBSTRToString(var4.bstrVal);
std::cout << str4;
}
运行结果
Object的相等判断请使用Equals方法,慎用==
static void Main(string[] args)
{
Console.WriteLine("Hello World!\n");
string str1 = "Hello Hubei\n";
string str2 = "Hello Hubei\n";
object obj1 = str1;
object obj2 = str2;
Console.WriteLine(obj1 == obj2);//true
Console.WriteLine(obj1.Equals(obj2));//true
string strTemp3 = new string(new char[] { 'a', 'b', 'c', 'd' });
string strTemp4 = new string(new char[] { 'a', 'b', 'c', 'd' });
object obj3 = strTemp3;
object obj4 = strTemp4;
Console.WriteLine(obj3 == obj4); //false
Console.WriteLine(obj3.Equals(obj4));//true
}
运行结果