我有一个设置为VT_NULL的COleVariant,当我尝试将bstrVal成员转换为CString时,我得到了垃圾。但是在较旧版本的程序中,我不会得到垃圾,但会得到一个空的CString,这是我想要的行为。这是违规代码的简化版本:
COleVariant myCOleVariant;
myCOleVariant.vt = VT_NULL;
CString myCString = myCOleVariant.bstrVal;
myCOleVariant是从数据库字段设置的,该字段可以包含字符串或可以包含NULL。数据库包含混合类型,因此使用COleVariant。在导致我的问题的特定情况下,数据库字段为NULL,转换为CString之前的COleVariant设置为VT_NULL。
一个简单的解决方法是添加一个函数:
CString COleVariantAsCString(COleVariant pVar)
{
CString retval;
if(pVar.vt == VT_NULL || pVar.vt == VT_EMPTY)
retval = _T("");
else
retval = pVar.bstrVal;
return retval;
}
我的问题是:在Visual Studio的最新版本或Windows 7中是否有任何更改会影响COleVariants的工作方式?我在程序中使用了很多Colevariant,并且担心可能还会发生其他更改,从而导致此类错误。
我正在使用VS 2008专业版。任何输入或想法都会受到赞赏,因为我对这种无法解释的行为变化感到非常困惑。为vaugue问题道歉。如果我有足够的知识来正确地询问它,我可能就不需要询问了。
最佳答案
根本无法保证当VARIANT.vt == VT_EMPTY或VARIANT.vt == VT_NULL时,其余字段将被清零。
解决方法功能是正确的方法。我只建议使用const COleVariant&
作为参数,以避免不必要的COleVariant对象处理。