Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема CString::CompareNoCase (число прочтений - 4321 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
CString::CompareNoCase
01. Мая 2008 :: 05:59
Печать  
Вот такой код:
Код
Выбрать все
	CString Test = "субконто";
	if (Test.CompareNoCase ("Субконто")) {
		::MessageBox (0, "fdfdf", "", 0);
	} 


будучи вставлен в 1С++ прекрасно работает и в релизе, и в дебаге. Но стоит запустить 1С++ под Purify, сразу и в дебаге, и в релизе, начинает выдаваться MessageBox. Что бы это могло быть? Purify гадит в локаль?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: CString::CompareNoCase
Ответ #1 - 01. Мая 2008 :: 06:57
Печать  
Сталкивался с таким пару раз - х.з. в чем дело.
Разбираться не стал, просто заменил на CCompare и все.

А как _stricmp работает?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: CString::CompareNoCase
Ответ #2 - 01. Мая 2008 :: 07:52
Печать  
kms писал(а) 01. Мая 2008 :: 06:57:
Сталкивался с таким пару раз - х.з. в чем дело.
Разбираться не стал, просто заменил на CCompare и все.

А как _stricmp работает?

Точно так же себя ведет. Наверное, изнутри все сводится к _stricmp.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: CString::CompareNoCase
Ответ #3 - 03. Мая 2008 :: 12:59
Печать  
Ну да, сводится.

Должен признаться, что мне вообще не особо ясно, как win32 работает с локалями.
К примеру
Код
Выбрать все
LPCSTR sz1 = "привет";
LPCSTR sz2 = "ПРИВЕТ";
setlocale(LC_ALL, "enu")
Msg("_stricmp, %i", _stricmp(sz1, sz2));
 


Дает 0. Разве это правильно?

А вот запуск под PurifyPlus с любыми заданными региональными установками (в т.ч. и 1251) дает 1.
Причем видно, что PurifyPlus не меняет значение локали, просто она перестает учитываться.
Короче, дело темное. Нерешительный
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: CString::CompareNoCase
Ответ #4 - 08. Мая 2008 :: 05:25
Печать  
Скорее всего, где-то глубоку внутре все сводится к вызову вин-апишной функции. Как известно, под W2000 и XP все ...A - строковые функции суть обертки, преобразующие аргумент в юникод, и вызывающие ...W функции.
А преобразование в юникод зависит от текущей кодовой страницы, а не от локали.
Но это тока мое имхо, код CompareNoCase я не копал.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: CString::CompareNoCase
Ответ #5 - 08. Мая 2008 :: 05:33
Печать  
Вот помню, спаривал как-то 1С и дллку от сбербанка для работы с банковскими картами. И мистика - как их дллку инициализирую, 1С не может открыть некоторые обработки. Нет такого файла говорит, и все. И ФС.СуществуетФайл то же самое.
До загрузки дллки - есть такой файл, после загрузки - нету!
И даже GetFileAttributes себя так же вела. Я полдня медитировал. Потом решил средствами ФС вывести список всех файлов в директории, и о чудо - файлы есть, но называются кракозябрами!!!
Далее штудирование MSDN, запуск IDA, и вот он, виновник.
SetFileApisToOEM. Видимо в сбербанке, когда портировали все это с доса, на всякий случай вставили туда этот вызов, после которого все виндовые функции работы с файлами использовали его имя в 866 кодовой странице. После загрузки дллки сделал SetFileApisToAnsi, и все заработало.
Потом правда, после моего письма, они эту каку убрали из своей дллки.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать