【问题标题】:Converting large strings from BSTR tp std::string?将大字符串从 BSTR 转换为 std::string?
【发布时间】:2013-12-27 10:11:05
【问题描述】:

我在 BSTR 中有字符串,我想使用 W2CA (WideCharToMultiByte) 对其进行转换:

USES_CONVERSION;
std::string myMBS = W2CA(myBSTR); // myBSTR is BSTR

但是当字符串非常大时 - 它会在这一行抛出异常“StackOverFlowException”。

但是当我使用这个时:

std::wstring myWide(myBSTR);
std::string myMBS(myWide.begin(), myWide.end());

我工作正常。 任何人都可以帮助解决这种行为吗?

更新:对于大字符串,我的意思是大约 10MB 的字符串。

【问题讨论】:

    标签: c++ string typeconverter bstr


    【解决方案1】:

    atlconv.hW2CA的实际定义:

    #define W2CA(lpw) ((LPCSTR)W2A(lpw))
    

    现在看W2A的定义:

    #define W2A(lpw) (\
        ((_lpw = lpw) == NULL) ? NULL : (\
                (_convert = (lstrlenW(_lpw)+1), \
                (_convert>INT_MAX/2) ? NULL : \
                ATLW2AHELPER((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw,
                             _convert*sizeof(WCHAR), _acp))))
    

    它调用alloca,它在堆栈上分配内存。所以很自然,如果字符串很长,你就有耗尽可用堆栈空间的风险。

    【讨论】:

    • 是的,看到了。看起来像使用带有大字符串的 alloca - 非常糟糕的主意。你能给我一些建议吗?
    • @user2706838:不要使用W2CA(或者至少不要使用可能很大的字符串)。编写一个内联函数来为您(更直接地)调用WideCharToMultiByte,然后使用它。
    • 使用 C++11,现在可以/合法地将 std::string 包装的字符数组直接传递给 WideCharToMultiByte
    猜你喜欢
    • 2015-09-27
    • 2018-09-23
    • 2019-03-31
    • 2021-07-18
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多