我们目前面临的问题是,在使用Windows文件打开/保存对话框时加载了一个外部组件(我们很遗憾不知道哪一个),一些系统会更改进程的语言环境,可能是通过致电setlocale(LC_ALL, "")
。
这会弄乱我们的应用程序,因为它依赖于所设置的标准语言环境(在运行时不会被我们自己的任何组件更改)。
因此,我们需要确保setlocale()
在进程内调用时从未产生任何影响,或者我们需要在调用此函数时检测,然后将语言环境重置为默认值" C&# 34;区域设置。
有没有办法实现这两个目标?
答案 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);