【问题标题】:Invalid null pointer when using _bstr_t使用 _bstr_t 时无效的空指针
【发布时间】:2012-08-23 13:29:04
【问题描述】:

我正在开发一个 COM DLL,但遇到了一些问题。我对一段代码进行了尝试捕获,在捕获中我从异常中得到了_bstr_t。我想要做的是捕获该异常并将其打印到一个字符串中,但是,当该异常被抛出时,它会向我抛出一个无效的空指针错误。我尝试查看有关如何检查空指针的 MSDN,但它似乎不起作用。我无法真正调试该错误,因为这是在客户端计算机上,并且在尝试输出信息时出现此错误。

catch(const _com_error& ex)
{
    ::OutputDebugStringW(ex.Description());

    _variant_t ret;
    std::string str = "#N/A ExcelException: ";
    _bstr_t desc = ex.Description();

    if(!desc || desc.GetBSTR() == L"")
    {
        str += ConvertBSTRToMBS(desc);
    }

    ret.SetString(str.c_str());
    *Result = ret.Detach();
}

std::string ConvertBSTRToMBS(_bstr_t bstr) 
{
    std::string converted((char *)bstr);
    return converted;
} 

【问题讨论】:

    标签: c++ string exception com bstr


    【解决方案1】:

    由于if 条件错误,ConvertBSTRToMBS 仅在bstr 为空时调用。 改正如下

    if(!!desc && desc.length() != 0)
    {
        str += ConvertBSTRToMBS(desc);
    }
    

    奇怪的!!desc 表示!(desc.operator!())。 如果BSTR 为空,_bstr_t::operator! 返回 true,因此您必须将其取反以检查非空。

    【讨论】:

    • 我看到了我犯的错误,我想我已经盯着这段代码太久了。但是我不能这样做 if(desc) 或 if(desc != NULL) 因为这会产生错误。我需要找到一种方法来查看它是否不为 NULL。
    • 以前从未见过这种语法,但它确实很好用。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多