在以下代码段中,
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
。
请解释。
答案 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
代替&&
:
||