我应该将CComBSTR比较为NULL

时间:2018-01-03 06:41:50

标签: c++ visual-studio com

在以下代码段中,

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 6573
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.Activity.InviteByContactActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
                                                              Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

检查CComBSTR bstrVal; HRESULT hr = GetVal(bstrForest); if (bstrVal!= NULL || bstrVal.Length() > 0) { … } 是否是有效检查,因为bstrVal!= NULL是一个类的对象? 我可以在Visual Studio中看到bstrVal的值如果未初始化则变为bstrVal

请解释。

2 个答案:

答案 0 :(得分:2)

请注意CComBSTR有一个重载的operator!=函数,其中包含一个整数。在C ++中NULL是一个宏,它扩展为整数值0

这意味着您并没有真正将bstrVal 对象NULL进行比较(它永远不会),而是调用operator!=重载,传递明确允许的零。

这意味着比较没问题。

答案 1 :(得分:1)

CComBSTR与NULL进行比较在您的示例中是合法的,因为CComBSTR会覆盖operator!=以支持NULL作为输入值(但有更好的选项可用于检查{{} 1}}有一个非NULL CComBSTR)。

但是,如果您只对长度为>的BSTR感兴趣0然后检查NULL是多余的:

BSTR

CComBSTR bstrVal; HRESULT hr = GetVal(&bstrVal); if (bstrVal.Length() > 0) { … } SysStringLen()的包装器,对于NULL CComBSTR::Length()返回0。

在您的示例中,如果BSTR已分配,则会输入if,即使其中包含0个字符。您可能打算使用BSTR代替&&

||