Re[4]: Блок памяти в BSTR и обратно.
От: Аркадий Россия  
Дата: 21.10.08 09:44
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, Аркадий, Вы писали:


ЮЖ>>>Вообще "The preferred method of passing binary data is to use a SAFEARRAY of VT_UI1, which will not be translated by OLE."

ЮЖ>>>но если очень нужно, то см. SysAllocStringByteLen: "This function is provided to create BSTRs that contain binary data."

А>>Это да, а как конвертировать из BSTR в char*?

ЮЖ>Что значит "конвертировать" ? Здесь нужно только преобразовать указатели. SysAllocStringByteLen выделяет буфер на n байт(столько же вернет и SysStringByteLen), сохраняет размер и возвращает указатель на начало буфера как BSTR.

ЮЖ>
ЮЖ>int main()
ЮЖ>{
ЮЖ>  char data[] = {'1', '2', 0, 0, '3', '4', 0, '5', '6'};
ЮЖ>  size_t size = sizeof(data)/sizeof(char);
    
ЮЖ>  if(BSTR bstr = ::SysAllocStringByteLen(data, size))
ЮЖ>  {
ЮЖ>    assert(::SysStringByteLen(bstr) == size);
ЮЖ>    char* str = reinterpret_cast<char*>(bstr);
        
ЮЖ>    assert(memcmp(str, data, size) == 0); 
    
ЮЖ>    ::SysFreeString(bstr);
ЮЖ>  }
ЮЖ>}
ЮЖ>


Спасибо!! Вот я тупил, как-то считал обязательным перевод даже мусорных байт в wchar... =) Действительно же, так намного проще.
С уважением, Аркадий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.