Блок памяти в BSTR и обратно.
От: Бабаев Аркадий Леонидович Россия  
Дата: 20.10.08 15:17
Оценка:
Здравствуйте. BSTR хранит информацию о своей длине, поэтому через BSTR можно передавать строки, в том числе содержание '\0'.
Собственно у меня есть задача, необходимо кучу байтов (CharHeap, там могут быть нулевые символы) переделать в BSTR, а потом обратно.

bstr_t для этих целей не годится. К специальным средствам прибегать я готов, но чем их будет меньше, тем лучше.
Самые хорошие методы (как мне показалось) реализации, я увидел такими, с использованием mbtowc и wctomb:

 void CharHeapToBstr(BSTR* bstr, const char* str, const ULONG len)
{
    wchar_t* wch = new wchar_t[len + 1];

    wch[len] = '\0';
    for (unsigned i = 0; i < len; i++)
        mbtowc(&wch[i], &str[i], 1);

    *bstr = SysAllocStringLen(wch, len);

    delete[](wch);
    return;
}

void BstrToCharHeap(char** str, ULONG* len, const BSTR bstr)
{
    *len = SysStringLen(bstr);//SysStringByteLen(bstr) / 2;
    *str = new char[*len + 1];

    memset(*str, '\0', *len+1);
    for(unsigned i = 0; i<= *len; i++)
        wctomb(&(*str)[i], bstr[i]);
    return;
}


Но при этом уже BstrToCharHeap возвращает пустую строчку. Подскажите пожалуйста, что я не так делаю испольщуя эти функции wctomb, или, если есть более удобный вариант, то его. Перечитал много с форума, ничего не нашел о блоках памяти, тут специфика — это не строки и там может быть любой мусор.

21.10.08 13:15: Перенесено модератором из 'C/C++' — Кодт
С уважением, Аркадий.
bstr charheap
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.