Конвертировать BSTR в CHAR * и CHAR * в BSTR в C - PullRequest
0 голосов
/ 22 декабря 2010

Мне нужно преобразовать тип данных BSTR в CHAR * в C. Есть ли способ сделать это без использования библиотек VC ++ или функций.Код должен быть на чистом C. Я думаю, что в 'comutil.h' есть функции, но они на C ++, я полагаю.

Кроме того, что касается функции SysAllocString, можем ли мы использовать ее в C и преобразовать в CHAR* ?.Пожалуйста, помогите.

Спасибо, sveerap

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Вы можете перейти от символа * к BSTR с помощью SysAllocStringByteLen ().Но это безопасно, только если char * содержит только символы ASCII, преобразование символов не происходит.Это не вызывает проблем будет довольно редко.

Следующий переход это MultiByteToWideChar (), вы обычно хотите установить аргумент CodePage в CP_ACP, если вы не знаете, что строка закодирована другим способом.В результате получается широкая строка, которую вы можете затем передать в SysAllocString () для получения BSTR.

Другой способ - WideCharToMultiByte (), при котором передача BSTR будет работать напрямую, если только он не содержит встроенных 0 символов.Однако преобразование в любом случае с потерями, остерегайтесь значительной головной боли, которая может возникнуть, когда вы работаете со строками, которые содержат символы с акцентом, или чем-то еще, что не может быть представлено на используемой вами кодовой странице.

0 голосов
/ 22 декабря 2010

Зависит от того, как вы определяете «библиотеки или функции VC ++».Тип BSTR в значительной степени является типом VC ++.Однако если вы считаете это типом «Windows», то в библиотеках «Windows» и «Windows» можно использовать функции манипуляции BSTR.Все зависит от того, что вы делаете, какой компилятор вы используете, и любых других технических ограничений.Было бы неплохо описать, почему вы не можете использовать библиотеки VC ++ в этом вопросе.

На самом деле тип BSTR достаточно хорошо понят и задокументирован.См. здесь .

Это не выходит за пределы возможностей, если вам по какой-то причине запрещено использовать какие-либо функции манипуляции Microsoft BSTR для написания собственных функций манипуляции BSTR для преобразованиямежду BSTR и char *.

Как дешевый и ОЧЕНЬ неприятный хак, я до этого приводил BSTR к символу *, а затем копировал каждый альтернативный символ в буфер или подобный.Однако это не справляется со специальными персонажами и является очень и очень неприятным взломом.Пожалуйста, не делайте этого, если только вы не можете гарантировать, что все символы в BSTR являются стандартными символами ASCII (или не волнует, не являются ли они таковыми) и делают это только как быстрый отладочный хак или что-то вроде этого, а не как правильное производствокод качества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...