【问题标题】:Release BSTR returned from recordset or not是否释放记录集返回的 BSTR
【发布时间】:2018-09-07 06:11:32
【问题描述】:

这里有一些 ADODB 代码从记录集中检索 BSTR,但我不确定 BSTR 是否应该与 SysFreeString 一起发布。现在它是并且它似乎正在工作,但你应该自己做吗?

    BSTR bstr = m_pRecordset->Fields->GetItem ( field )->Value.bstrVal;

    int len = SysStringLen(bstr);

    while (len > 0 && iswspace(bstr[len-1])) len--;

    BSTR newstr = SysAllocStringLen(bstr, len);

    SysFreeString(bstr);
    SysFreeString(newstr);

【问题讨论】:

    标签: mfc com ado


    【解决方案1】:

    您的代码错误。 m_pRecordset->Fields->GetItem ( field )->ValueVARIANT 返回为 _variant_t

    您应该将对象保存在临时变量中,访问数据,然后析构函数将完成剩下的工作。

    _variant_t val = m_pRecordset->Fields->GetItem ( field )->Value;
    
    int len = SysStringLen(val.bstrVal);
    
    while (len > 0 && iswspace(bstr[len-1])) len--;
    
    BSTR newstr = SysAllocStringLen(val.bstrVal, len);
    ...
    SysFreeString(newstr);
    

    See sample here in the MSDN.

    另外应该提到的是,最好使用CComBSTR_bstr_t 而不是BSTR。

    【讨论】:

    • 当您使用由 Visual C++ 生成的代码而不是原始 COM 接口时,您将不再使用 BSTR 或 VARIANT,而始终使用 _bstr_t 和 _variant_t,并且(几乎)忘记释放内存,因为如您所知,它们是智能包装类。因此,在您的代码中,我不会使用 BSTR,也不会使用 SysFreeString。此外,您的链接指向德国文档 :-)
    • @sim:我也建议使用_bstr_t,虽然我不确定你会如何在这里使用它。虽然它有一个带有variant_t& 的c'tor,但构造的对象是严格不可变的,并且似乎没有任何方法可以在另一个_bstr_t/wchar_t[]/ 的子范围内构造_bstr_t BSTR.
    • @IInspectable - 我只是在谈论 newstr 变量,它可能是 _bstr_t 而不是 BSTR
    • 你是对的。我只是按照用户编写的代码使用... _bstr_t 在这里也好得多!
    • 在这里使用CComBSTR 可能更合适,因为它提供了一个带有显式长度参数的c'tor
    猜你喜欢
    • 2012-12-12
    • 2011-09-06
    • 1970-01-01
    • 2012-06-08
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多