6

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

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

因此,我们需要确保setlocale()在进程中调用时永远不会产生任何影响,或者我们需要检测何时调用此函数,然后将语言环境重置为默认的“C”语言环境。

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

4

1 回答 1

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);
于 2014-10-02T10:08:40.643 回答