gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:02 27 4
gpt4 key购买 nike

我们目前面临的问题是,当使用 Windows 文件打开/保存对话框时加载的外部组件(不幸的是我们不知道是哪个)一些系统更改了进程的区域设置,可能是通过调用 setlocale(LC_ALL, "").

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

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

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

最佳答案

这并不是对问题的真正直接回答,而是对潜在问题的解决方案。原来是 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);

关于c++ - 是否可以在进程中禁用 setlocale()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26101796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com