Работа с SAFEARRAY
1) Известно, что есть удобная обертка для BSTR, называющаяся bstr_t. Которая, правда, не умеет работать с BSTR, содержащими внутри '\0' (или умеет? Если умеет, то что для этого нужно, я исходники смотрел, судя по ним не умеет), и тем не менее удобная.
Есть ли такая же для SAFEARRAY? Честно говоря, я даже не могу придумать, как красиво спроектировать такую обертку, но делать всё время для всех SAFEARRAY сложный разбор каждого элемента - очень сложно, это захламляет код, делая все методы длинным полотенцем.
Как это решается опытными людьми?
2) wchar_t и char. Функция wcstombs копирует строку wchar_t в char до первого нулевого символа. Копирует корректно, даже русский шрифт.
А как поступать, если она может содержать любое количество нулевых символов?
Есть функция wctomb, конвертирующая один элемент. Сейчас я в цикле прохожу по всей длине строчки, конвертируя каждый элемент. Но при этом русский шрифт wchar_t имеет код за 1000, в то время, как char - 0-255, и если русскоязычный символ wchar_t конвертировать функцией wctomb в чар, то в чаре появляется _мусор_, но не русскоязычный аналог.
Аналогично когда я конвертирую функцией mbtowc - char в wchar_t, то wchar_t содержит КОД от char, который не соответствует wchar_t-шному аналогу русского символа.
А мне надо туда и обратно конвертировать правильно. Как это решается? Или может быть bstr_t позволяет это делать для строк с '\0' символами?
3) Правильно же я понимаю, что нулевой символ в wchar_t - это два байта?
1) Известно, что есть удобная обертка для BSTR, называющаяся bstr_t. Которая, правда, не умеет работать с BSTR, содержащими внутри '\0' (или умеет? Если умеет, то что для этого нужно, я исходники смотрел, судя по ним не умеет), и тем не менее удобная.
Есть ли такая же для SAFEARRAY? Честно говоря, я даже не могу придумать, как красиво спроектировать такую обертку, но делать всё время для всех SAFEARRAY сложный разбор каждого элемента - очень сложно, это захламляет код, делая все методы длинным полотенцем.
Как это решается опытными людьми?
2) wchar_t и char. Функция wcstombs копирует строку wchar_t в char до первого нулевого символа. Копирует корректно, даже русский шрифт.
А как поступать, если она может содержать любое количество нулевых символов?
Есть функция wctomb, конвертирующая один элемент. Сейчас я в цикле прохожу по всей длине строчки, конвертируя каждый элемент. Но при этом русский шрифт wchar_t имеет код за 1000, в то время, как char - 0-255, и если русскоязычный символ wchar_t конвертировать функцией wctomb в чар, то в чаре появляется _мусор_, но не русскоязычный аналог.
Аналогично когда я конвертирую функцией mbtowc - char в wchar_t, то wchar_t содержит КОД от char, который не соответствует wchar_t-шному аналогу русского символа.
А мне надо туда и обратно конвертировать правильно. Как это решается? Или может быть bstr_t позволяет это делать для строк с '\0' символами?
3) Правильно же я понимаю, что нулевой символ в wchar_t - это два байта?
Придерживайтесь пожалуйста принципа - одна тема - один вопрос.
Во ворых четко его сформулируйте.
В ВСВ для работы с расширенными символами используеться класс WideString. Чем он вас не устраивает?
SAFEARRAY - это структура, соответственно если вам нужно делать какую либо обертку - создайте класс и в нем это все реализуйте. Не понятно, кто вас заствляет писать "длинным полотенцем"?
2. Для правильной конвертации русских символов используйте либо _mbtowc_l (и ее аналоги) либо пишити свою.
3. Любой символ в wchar_t - это два байта.
Есть ли такая же для SAFEARRAY?
SAFEARRY.H - Helpers to handle SAFEARRAY in C++
Во ворых четко его сформулируйте.
В ВСВ для работы с расширенными символами используеться класс WideString. Чем он вас не устраивает?
SAFEARRAY - это структура, соответственно если вам нужно делать какую либо обертку - создайте класс и в нем это все реализуйте. Не понятно, кто вас заствляет писать "длинным полотенцем"?
Вопросы был - есть ли уже готовые классы-обертки для SAFEARRAY? Проблему, которая меня останавливает самому написать, я тоже описал - "Честно говоря, я даже не могу придумать, как красиво спроектировать такую обертку". Т.е. я не представляю, как красиво написать такую обертку и не знаю, существуют ли уже описанные.
Вопрос - есть ли готовые, если есть - куда смотреть и где их искать :)
2. Для правильной конвертации русских символов используйте либо _mbtowc_l (и ее аналоги) либо пишити свою.
С++ Builder 6 говорит, что такой функции не существует. А как написать свою - даже не представляю, как сделать это красиво. Тупо запомнить все char-значения и wchar_t-значения для каждой буквы русского алфавита и подставлять их, по-моему, неправильное решение. К тому же, может, такая проблема не только с русским шрифтов... это мне для каждого значения чара вручную искать аналог ? Или можно проще?
Спасибо! Нашел там много полезного!
Вопрос - есть ли готовые, если есть - куда смотреть и где их искать :)
Вы начните в процессе написания и использования вам придёт "красивое" решение.
С++ Builder 6 говорит, что такой функции не существует. А как написать свою - даже не представляю, как сделать это красиво. Тупо запомнить все char-значения и wchar_t-значения для каждой буквы русского алфавита и подставлять их, по-моему, неправильное решение. К тому же, может, такая проблема не только с русским шрифтов... это мне для каждого значения чара вручную искать аналог ? Или можно проще?
Читаем MSDN #include <stdlib.h>