| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | «  : 01-09-2003 06:29 »  |  | 
 
 VC 6.0 Проект  ActivX Есть не обходимость писать код который будет компилися как с Уникодом нак и без него. Нужен пример как  проще оформить куски такого вида char s[10];double b;
 s[0]='Y';
 s[1]=':';
 b=psdg->MGD.Zero-(((double )psdg->m_CGP.Y)/psdg->MGD.DY  )  ;
 gcvt(b,8,&s[2]);
 pDC->ExtTextOut( 5,5+DY+5,ETO_CLIPPED,r,s,8,NULL) ;
Чтобы компилилось как в юникоде так и безнего. |  
						| 
								|  |  
								| « Последнее редактирование: 19-12-2007 19:53 от Алексей1153++ » |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #1 : 01-09-2003 07:00 »  |  | 
 
 TCHAR s[10]; double b;
 s[0]=TEXT('Y');
 s[1]=TEXT(':');
 b=psdg->MGD.Zero-(((double )psdg->m_CGP.Y)/psdg->MGD.DY  )  ;
 gcvt(b,8,&s[2]);
 pDC->ExtTextOut( 5,5+DY+5,ETO_CLIPPED,r,s,8,NULL) ;
 
 что такое gcvt не знаю.
 Остальные ф-ции должны иметь как ANSI так и UNICODE версии и выбираются они на этапе компиляции в зависимости от того определена переменная UNICODE или нет.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #2 : 01-09-2003 07:11 »  |  | 
 
 gcvt  это функция типа itoa конвертит double в текстовую строку. s[0]=TEXT('Y');
 
 А TEXT() и _Т() это  одно и тоже?  Или нет. Я посмотрел по исходникам получается что при включении юникода  TCHAR обявляется как WCHAR и все дела? |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #3 : 01-09-2003 07:14 »  |  | 
 
 А TEXT() и _Т() это одно и тоже
 
 Посмотри как они объявлены, это же #define обыкновенный. TCHAR обявляется как WCHAR и все дела?
 
 А ты чего хотел? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #4 : 01-09-2003 09:07 »  |  | 
 
 PSD - TEXT(), _T(), L() - это макросы кодирующие строку из однобайтной в двубайтную...
 Я бы сделал так
 
 
 #ifdef UNICODE
 #define MYCHAR char
 #else
 #define MYCHAR TCHAR
 #endif
 
 После чего определил бы UNICODE в установках проекта для компиляции в юникод и наоборот.
 
 Конечно придется передевайнить еще и strstr strcpy и т.д. - т.е. все тобой используемые функции так же как тип переменной, для различных вариантов использую для юникода функции из абора wcsstr вместо strstr и т.д.
 
 Я обычно создавал дирректорию common в которую витыкал файл .h с описаниями таких вот штук....
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Serega 
								Гость
 | 
								|  | « Ответ #5 : 01-09-2003 09:53 »  |  | 
 
 Попробуй так double d = ...;_bstr_t str = _T)"Y{": + _bstr_t)_variant_t)d::;
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #6 : 01-09-2003 09:55 »  |  | 
 
 Тема использования Unicode не плохо освещена у Рихтера в его "Windows для профи" еще я читал про это у Румянцева "Азбука программирования Win32 API" я вывел для себя следующие правила 1. вместо string.h использовать tchar.h 2. вместо char использовать TCHAR 3. строковые литералы обрамлять макросом _T() 4. вместо привычных функций работы со строками, типа strcpy, использовать макросы из tchar.h, типа _tcscpy что касается приведенного фрагмента кода, то ИМХО лучше вместо  char s[10(; double b;
 s[0(='Y';
 s[1(='{';
 ...
 _gcvt)b,8,&s[2(:;
использовать #include <tchar.h>...
 TCHAR s[10(;
 double b;
 ...
 _stprintf)s, _T)"Y=%f":, b:;
во всяком случае _gcvt всегда независимо от определения макросов _UNICODE и UNICODE сформирует не Unicode, а ANSI строку |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #7 :  01-09-2003 09:58 »   |  | 
 
 _UNICODE и UNICODE сформирует не Unicode, а ANSI строку
 
 Я не имел ввиду системный макрос  а говорил о собственном определении типа данных - т.е. используется или не используется UNICODE . |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Serega 
								Гость
 | 
								|  | « Ответ #8 : 01-09-2003 10:07 »  |  | 
 
 А зачем придумывать какие-то макросы, использовать не переносимые функции, когда все эти проблемы уже решены до нас |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #9 : 01-09-2003 10:16 »  |  | 
 
 Это как ?
 
 А у меня так- я вобще не пишу не UNICODE программы для Windows NT/2k/XP/2003. И не мучаюсь. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #10 : 01-09-2003 10:23 »  |  | 
 
 А зачем придумывать какие-то макросы, использовать не переносимые функции, когда все эти проблемы уже решены до нас Если рассматривать проблему относительно Win32, а не ActivX то она решена до нас именно применением макросов из tchar.h |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #11 : 01-09-2003 10:59 »  |  | 
 
 А у меня так- я вобще не пишу не UNICODE программы для Windows NT/2k/XP/2003. И не мучаюсь.
 
 У меня тут половина 95/98 поэтому приходися иметь покрайней мере две версии. |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #12 : 01-09-2003 11:27 »  |  | 
 
 У меня тут половина 95/98 поэтому приходися иметь покрайней мере две версии.
 я тоже работаю и под 98/Me и под 2000/XP, но делаю одну неUnicode версию а применение tchar.h рассматриваю как задел на будущее (вдруг мелкомягкие вовсе откажутся от ANSI, тем более в CE они это уже сделали) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #13 : 01-09-2003 12:04 »  |  | 
 
 Если рассматривать проблему относительно Win32, а не ActivX
 то она решена до нас именно применением макросов из tchar.h
 
 Очень интересно... У меня есть 2000 строк кода рботы с char и мне надо их перевести на TCHAR и работу с юникодом. Давай ка автоматизируй одним include "tchar.h" весь этот процесс... |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #14 : 01-09-2003 14:34 »  |  | 
 
 автоматизируй одним include "tchar.h" весь этот процесс
 
 А кто говорил что это делается автоматически включением include "tchar.h" я говорил про применение макросов из него |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #15 : 01-09-2003 14:50 »  |  | 
 
 Тогда разберись с тем, что я написал.Я написал, что можно автоматизировать употребление макросов TCHAR.H и стандратных вызовов функций str*** с помощью #define собственного ФЛАГА (а не макроса), и дополнительного .h файла в котором переопределить употребление вместо str*** wcs*** из файла tchar.h в зависимости от использования кода...
 
 Пример
 
 //
 
 #ifndef __common_h
 #define __common_h
 
 #ifdef UNICODE_COMPILE
 MYCHA TCHAR
 #define strstr wcsstr
 ......
 #else
 MYCHAR char
 #endif
 
 Таким образом переделка текста в 5 - 10 тыш строк приводится к действию во всех файлах - замена char -> MYCHAR Find+Replace
 
 Подключения common.h во все места куда надо и определения флага UNICODE_COMPILE в проекте = 1....
 
 То что я написал чуть попроще прежде.
 
 Теперь посоветуй метод проще - я хотел бы его знать ибо это вопрос нетревиальный (без издевки или иронии), потому как я не впервый раз проекты перерабатываю из - за таких вещей...
 
 
 ПыСы Правда в этот метод не подойдут алгоритмы с смещением и редактированием строк с побайтной работой, так как замена на двух байтный юникод потребует изменение цифровых коэффициентов - расчитываемых с учетом 1 - го байта на символ и не с помощью стандартных процедур...
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #16 : 01-09-2003 15:34 »  |  | 
 
 Теперь посоветуй метод проще - я хотел бы его знать ибо это вопрос нетревиальный (без издевки или иронии), потому как я не впервый раз проекты перерабатываю из - за таких вещей...
 
 Полностью согласен, что твой метод замены  #define strstr wcsstr
 
 при перерабатывании готовых проектов ЛУЧШИЙ я говорил про новые проекты хотя от твоего дополнительного хедера я бы не отказался    у него есть то преимущество, что можно пользоваться привычными функциями :!:  microsoft  тут явно тормознула P.S.   а можно char так же переопределить :?: тогда  char -> MYCHAR Find+Replace
 
  делать не надо было бы |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #17 : 01-09-2003 16:13 »  |  | 
 
 P.S. а можно char так же переопределить  тогда
 
 Да действительно - а про char хедер - к сожалению он переопределятся в огромном файле коммерческого проекта - если выкрою время, то я вытащу и опубликую... |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #18 : 05-09-2003 13:42 »  |  | 
 
 с переопределением char это уже я тормознул :? Люди ! а какая реальная причина использования UNICODE ?
 Win CE или что-то другое?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #19 : 05-09-2003 14:12 »  |  | 
 
 Например, если на компьютере, на котором ты запускаешь программу, системный шрифт и локаль не русские, то без unicode будут еггоглифы   Конечно, если текст с кириликой. Вот англопишуших это совсем не беспокоит... |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Diletant 
								Помогающий    Offline | 
								|  | « Ответ #20 : 05-09-2003 15:36 »  |  | 
 
 P.S. а можно char так же переопределить  тогда С переопределением char или BYTE все не так просто. По крайней мере, для сетевых проектов, где команды протоколов должны быть  строками с однобайтными символами. Или для всевозможных почтовых утилит.  Поэтому IMHO метод с TCHAR  предпочтительней, посколькупозволяет сразу отделить переменные, для которых Unicode использовать нельзя. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| dorador 
								Гость
 | 
								|  | « Ответ #21 : 05-09-2003 16:02 »  |  | 
 
 Например, если на компьютере, на котором ты запускаешь программу, системный шрифт и локаль не русские, то без unicode будут еггоглифы
 Конечно, если текст с кириликой.
 
 А что если unicode-прогу с русским интерфейсом запустить на компе, где никакие языки кроме английского не установлены, на экране будет кириллица? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #22 : 05-09-2003 18:12 »  |  | 
 
 Нет конечно - но это уже будет не твоя вина    |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |