2011-11-18 182 views
3

我有一个COleVariant被设置为VT_NULL,当我尝试并将bstrVal成员转换为CString时,我得到了垃圾。在我的程序的旧版本中,我不会收到垃圾,我得到一个空的CString,这是我想要的行为。这是有问题的代码的简化版本:将COleVariant转换为CString

COleVariant myCOleVariant; 
    myCOleVariant.vt = VT_NULL; 
    CString myCString = myCOleVariant.bstrVal; 

myCOleVariant从数据库字段,它可以包含一个字符串或可以包含空集。数据库包含混合类型,因此使用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或会影响COleVariants工作方式的Windows 7改变了吗?我在我的程序中使用了很多变体,并且担心可能会有其他更改会导致这样的错误。

我正在使用VS 2008专业版。任何意见或想法都会受到赞赏,因为我对这种无法解释的行为变化感到困惑。对vaugue问题抱歉。如果我足够了解问题的话,我可能不需要问这个问题。

+0

你描述的是不能在Windows XP(x86,SP3)上重现... – 2011-11-18 10:42:02

+0

@等待被删除当我在XP上运行我的程序myCString将是空的,只有当我升级到Windows 7,问题,你使用XP的结果是什么?一个空的字符串或一个充满垃圾的字符串? –

回答

3

简而言之,当VARIANT.vt == VT_EMPTY或VARIANT.vt == VT_NULL时,其余的字段将被清零。

您的解决方法功能是正确的方法。我只会建议使用const COleVariant&作为参数来避免不必要的COleVariant对象应对。

+0

谢谢你,你是对的COleVariant&。 –

+2

解决方法仍然是错误的,只有访问bstrVal如果vt == vtBSTR。一致地使用COleVariant :: ChangeType()。 –

+0

+ Hans Passant:绝对。我只是假设,作者知道这个函数有什么样的值。 –