是否可以在进程中禁用setlocale()?

时间:2014-09-29 14:05:06

标签: c++ setlocale

我们目前面临的问题是,在使用Windows文件打开/保存对话框时加载了一个外部组件(我们很遗憾不知道哪一个),一些系统会更改进程的语言环境,可能是通过致电setlocale(LC_ALL, "")

这会弄乱我们的应用程序,因为它依赖于所设置的标准语言环境(在运行时不会被我们自己的任何组件更改)。

因此,我们需要确保setlocale()在进程内调用时从未产生任何影响,或者我们需要在调用此函数时检测,然后将语言环境重置为默认值" C&# 34;区域设置。

有没有办法实现这两个目标?

1 个答案:

答案 0 :(得分:2)

这不是问题的直接答案,而是潜在问题的解决方案。事实证明,最近对iCloud的更新导致了这个问题,例如看这篇文章:

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

所以有两种解决方案,一种是重命名ShellStreams.dll,另一种是完全卸载iClould(如果它还没有使用的话)。

可以使用的实际保护是使setlocale()只是线程全局而不是进程全局:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)

它在我们的一个简单的测试应用程序中工作,但在现实世界的情况下(因此对我们来说不是真正的解决方案)。

如果无法卸载iCloud,解决此问题的最可靠方法是使用" _l" -functions,它们使用如下特定语言环境:

_locale_t localeInfo = _create_locale(LC_NUMERIC, "C");
_sprintf_l(string, format, localeInfo, number);
_free_locale(localeInfo);