2014-09-29 4 views
5

В настоящее время мы сталкиваемся с проблемой, что внешний компонент (мы, к сожалению, не знаем, который) загружается при использовании диалога открытия/сохранения файла Windows, некоторые системы меняют локаль процесса, возможно, делая вызов setlocale(LC_ALL, "").Можно ли отключить setlocale() в процессе?

Это испортит наше приложение, потому что оно зависит от стандартного языкового стандарта (который не изменяется ни одним из наших собственных компонентов во время выполнения).

Таким образом, мы должны убедиться, что ни один из setlocale() никогда не имеет никакого эффекта при вызове в процессе, или нам нужно обнаруживать, когда вызывается эта функция, а затем сбрасывает языковой стандарт по умолчанию в «C».

Есть ли способ достичь любой из этих целей?

+1

Вы можете поставить точку останова на функции библиотеки - см. https://stackoverflow.com/questions/3080624/debug-break-on-win32-api-functions – sashoalm

+0

@sashoalm Спасибо, но, к сожалению, мы не можем отладить эту проблему, потому что это не происходит на любом компьютере разработки. Даже если бы это было сделано, и мы знали этот компонент, это не помогло бы значительно защитить процесс от таких изменений. – floele

+0

Попробуйте использовать батут, а затем - https://stackoverflow.com/questions/189725/what-is-a-trampoline-function – sashoalm

ответ

2

Это не прямой ответ на вопрос, а решение проблемы. Оказалось, что недавнее обновление ICloud вызвало этот вопрос, увидеть этот пост, например:

https://discussions.apple.com/thread/5356698

Таким образом, есть два решения, одно переименование ShellStreams.dll, другой полностью УДАЛЕНИЕ iClould (если это не используется в любом случае).

фактической защиты, которая может быть использована делает setlocale() только нити глобальными, а не процесс глобальный:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) 

Он работал в простом тестовом приложении наш, но не в реальном мире деле (так что это не настоящее решение для нас).

Самый надежный способ решить эту проблему, если вы не можете удалить ICloud, чтобы использовать «_l» -функции, которые работают с использованием конкретного языкового стандарта, как это:

_locale_t localeInfo = _create_locale(LC_NUMERIC, "C"); 
_sprintf_l(string, format, localeInfo, number); 
_free_locale(localeInfo); 
Смежные вопросы