setlocale () не влияет на ConvertBSTRToString (), но общесистемные настройки влияют?

Дано: приложение ASP.Net, которое использует устаревшую библиотеку COM устаревшую библиотеку COM, которая построена без Unicode (MBCS) на сервере разработки Windows 2008, на котором все это работает.

Требуется: поддержка пользователей веб-приложений в разных регионах

Контрольная работа:

1) Я установил на сервере локаль системы на русский язык и протестировал русские входы.

.NET обрабатывает их как UTF16, передает COM как BSTR, COM преобразует их в char *, используя ConvertBSTRToString и текущую локаль (русский язык), записывает их в файл, читает их в файл, передает обратно в .NET и получает правильные результаты.

2) Я устанавливаю языковой стандарт системы обратно на США / английский, добавляю код либо в приложение ASP.NET, либо в сам COM, чтобы явно установить языковой стандарт на русский язык, языковой стандарт установлен успешно (я запрашиваю его и возвращаю русский язык), COM получает UTF -16 BSTR, использует ConvertBSTRToString для преобразования его в char * и получает вопросительные знаки «???»!

Почему?? В чем разница между установкой общесистемной локали и вызовом setlocale () в процессе? В чем тогда смысл setlocale? Использует ли ConvertBSTRToString что-то другое, кроме текущего языкового стандарта?

Я также пробовал делать

    System.Threading.Thread.CurrentThread.CurrentCulture = 
new System.Globalization.CultureInfo("ru-RU");

внутри вызывающего ASP.NET объекта COM и попытался сделать

setlocale(LC_ALL, "Russian");

        SetThreadLocale(
MAKELCID(MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), SORT_DEFAULT));

вместе с setlocale () внутри библиотеки COM; нет эффекта.

Я был бы очень признателен за информацию по этому поводу!


person MK.    schedule 13.07.2010    source источник


Ответы (1)


Из документации не ясно, что ConvertBSTRToString () использует для определения текущего языкового стандарта. Но вы можете быть уверены, что это не языковой стандарт CRT, установленный функцией setlocale (). Вам почти наверняка нужно вызвать SetThreadLocale ().

Используйте WideCharToMultiByte (), чтобы было меньше догадок.

person Hans Passant    schedule 13.07.2010
comment
Спасибо, я попробовал и обновил вопрос. Похоже, это не имеет значения. - person MK.; 13.07.2010
comment
Спасибо, вы правы. ConvertBSTRToString () вызывает под капотом WideCharToMultiByte (), игнорируя настройку локали. Вызов WideCharToMultiByte () явно решает проблему (за исключением того, что код повсюду полагается на сломанный ConvertBSTRToString (), и исправить это будет нетривиально, спасибо, Microsoft) - person MK.; 14.07.2010