Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с SAFEARRAY

1.8K
24 мая 2008 года
Arkady
153 / / 18.12.2007
Здравствуйте,

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
24 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Arkady
Здравствуйте,

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 - это два байта.

246
24 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Arkady

Есть ли такая же для SAFEARRAY?


SAFEARRY.H - Helpers to handle SAFEARRAY in C++

1.8K
24 мая 2008 года
Arkady
153 / / 18.12.2007
Цитата: kot_
Придерживайтесь пожалуйста принципа - одна тема - один вопрос.
Во ворых четко его сформулируйте.
В ВСВ для работы с расширенными символами используеться класс WideString. Чем он вас не устраивает?
SAFEARRAY - это структура, соответственно если вам нужно делать какую либо обертку - создайте класс и в нем это все реализуйте. Не понятно, кто вас заствляет писать "длинным полотенцем"?



Вопросы был - есть ли уже готовые классы-обертки для SAFEARRAY? Проблему, которая меня останавливает самому написать, я тоже описал - "Честно говоря, я даже не могу придумать, как красиво спроектировать такую обертку". Т.е. я не представляю, как красиво написать такую обертку и не знаю, существуют ли уже описанные.
Вопрос - есть ли готовые, если есть - куда смотреть и где их искать :)

Цитата: kot_

2. Для правильной конвертации русских символов используйте либо _mbtowc_l (и ее аналоги) либо пишити свою.



С++ Builder 6 говорит, что такой функции не существует. А как написать свою - даже не представляю, как сделать это красиво. Тупо запомнить все char-значения и wchar_t-значения для каждой буквы русского алфавита и подставлять их, по-моему, неправильное решение. К тому же, может, такая проблема не только с русским шрифтов... это мне для каждого значения чара вручную искать аналог ? Или можно проще?

Цитата: GIZMO
SAFEARRY.H - Helpers to handle SAFEARRAY in C++


Спасибо! Нашел там много полезного!

332
30 мая 2008 года
Valiant
416 / / 27.09.2004
Цитата: Arkady
Вопросы был - есть ли уже готовые классы-обертки для SAFEARRAY? Проблему, которая меня останавливает самому написать, я тоже описал - "Честно говоря, я даже не могу придумать, как красиво спроектировать такую обертку". Т.е. я не представляю, как красиво написать такую обертку и не знаю, существуют ли уже описанные.
Вопрос - есть ли готовые, если есть - куда смотреть и где их искать :)


Вы начните в процессе написания и использования вам придёт "красивое" решение.

Цитата: Arkady

С++ Builder 6 говорит, что такой функции не существует. А как написать свою - даже не представляю, как сделать это красиво. Тупо запомнить все char-значения и wchar_t-значения для каждой буквы русского алфавита и подставлять их, по-моему, неправильное решение. К тому же, может, такая проблема не только с русским шрифтов... это мне для каждого значения чара вручную искать аналог ? Или можно проще?


Читаем MSDN #include <stdlib.h>

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог