Здравствуйте. BSTR хранит информацию о своей длине, поэтому через BSTR можно передавать строки, в том числе содержание '\0'.
Собственно у меня есть задача, необходимо кучу байтов (CharHeap, там могут быть нулевые символы) переделать в BSTR, а потом обратно.
bstr_t для этих целей не годится. К специальным средствам прибегать я готов, но чем их будет меньше, тем лучше.
Самые хорошие методы (как мне показалось) реализации, я увидел такими, с использованием mbtowc и wctomb:
Но при этом уже BstrToCharHeap возвращает пустую строчку. Подскажите пожалуйста, что я не так делаю испольщуя эти функции wctomb, или, если есть более удобный вариант, то его. Перечитал много с форума, ничего не нашел о блоках памяти, тут специфика — это не строки и там может быть любой мусор.
21.10.08 13:15: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, Бабаев Аркадий Леонидович, Вы писали:
БАЛ>Здравствуйте. BSTR хранит информацию о своей длине, поэтому через BSTR можно передавать строки, в том числе содержание '\0'. БАЛ>Собственно у меня есть задача, необходимо кучу байтов (CharHeap, там могут быть нулевые символы) переделать в BSTR, а потом обратно.
Вообще "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 хранит информацию о своей длине, поэтому через BSTR можно передавать строки, в том числе содержание '\0'. БАЛ>>Собственно у меня есть задача, необходимо кучу байтов (CharHeap, там могут быть нулевые символы) переделать в BSTR, а потом обратно.
ЮЖ>Вообще "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*?
ЗЫ: про SAFEARRAY of VT_UI1 я как-то упустил, спасибо, что глаза мне открыли, я думал именно BSTRом оно и передается...
Здравствуйте, Аркадий, Вы писали:
ЮЖ>>Вообще "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.
Здравствуйте, Бабаев Аркадий Леонидович, Вы писали:
БАЛ>Собственно у меня есть задача, необходимо кучу байтов (CharHeap, там могут быть нулевые символы) переделать в BSTR, а потом обратно.
А почему вы не хотите обычный пересылкой байт
объявите метод как
Здравствуйте, ioni, Вы писали:
I>Здравствуйте, Бабаев Аркадий Леонидович, Вы писали:
БАЛ>>Собственно у меня есть задача, необходимо кучу байтов (CharHeap, там могут быть нулевые символы) переделать в BSTR, а потом обратно. I>А почему вы не хотите обычный пересылкой байт I>объявите метод как
SendBinaryData(long len, byte* data)
и вперед
Надо, чтобы это потом теоретически мог воспринять VBA или кто угодно подобный. Как он это будет делать — не моя задача, а вот перекинуть "мусор" я обязан. Ну и, соответственно, прочитать "мусор".
Насколько я понял, методы пересылки байт — только через SAFEARRAY (что рекомендуется) или через BSTR...
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Здравствуйте, Аркадий, Вы писали:
ЮЖ>>>Вообще "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.
ЮЖ>