2014-09-27 3 views
0

Я фактически использую функцию WideCharToMultiByte для преобразования строки VB6 в строку C (char *). Все работает нормально, за исключением того, что если исходная строка содержит нулевой символ, то строка C усекается.VB6 string to char * conversion: avoid null character

Для exmaple:

vbString = "Hello " & Chr(0) & " world!" 

Результирующая строка С Hello \0. Я не могу найти какой-либо вариант в документации по функциям, чтобы избежать такого поведения.

Любые идеи?

+2

«Строка C» не обязательно ANSI или ASCII, многие компиляторы поддерживают UTF-16LE. Но так как NUL всегда заканчивается в любом случае, нет, вы ничего не можете сделать. Если код, написанный на C, не использует операции «байт»/«char», а не «строковые» операции, у вас не может быть символ NUL. Возможно, есть функции BSTR, которые вы можете использовать instad? – Bob77

+0

... и даже если бы вы могли, большинство вещей, которые использовали бы строку, увидели бы встроенный NUL в качестве конца строки и проигнорировали остальные – Plutonix

+0

@ Bob77 Вы правы, ребята. Но я решил это, итерации в строковые символы VB6 и ручную замену '\ 0' на одно пространство. Благодаря! – cdonts

ответ

1

Строка VB6 на самом деле является BSTR, с которой можно управлять с помощью функций BSTR или классов, таких как: SysStringLen, CComBSTR, SysAllocString и т. Д. CComBSTR может даже преобразовать его в массив. Я не тестировал, но считаю, что нулевые символы будут сохранены. После того, как вы используете функцию строки с нулевым завершением, нулевой символ будет интерпретироваться как конец строки.

+0

Привет, спасибо за ваш ответ. Да, вы правы, нулевые символы будут сохранены, но проблема заключается в передаче строки любой функции C. – cdonts

+0

@cdonts: Это проблема с функцией C. Рефакторируйте это, чтобы принять 'BSTR', если вам нужно иметь дело с '\ 0', являющимся допустимым символом. – wqw

3

Усечение происходит только в том случае, если вы обрабатываете строку VB как завершающую нуль. WideCharToMultiByte() позволяет указать фактическую длину строки, поэтому нули игнорируются. Строки VB представляют собой строки COM BSTR, поэтому вы можете использовать SysStringLen(), чтобы получить полную длину строки VB и передать ее WideCharToMultiByte().