将大字符串从BSTR转换为std :: string?

时间:2013-12-27 10:11:06

标签: c++ string typeconverter bstr

我在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());

我工作正常。 任何人都可以帮忙解决这个问题吗?

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

1 个答案:

答案 0 :(得分:2)

W2CA了解atlconv.h的实际定义:

#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,它在堆栈上分配内存。因此,如果字符串非常长,您很可能会耗尽可用的堆栈空间。