From 3591388c75ab982862ef777cd6e6b71aef8f40f9 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 16 Feb 2021 19:03:37 +0100 Subject: [PATCH] oleaut32: Use C locale in VARIANT_BstrFromReal. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50672 Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard (cherry picked from commit 22a1485c08fb219444f7bb45b37c26af7c203d19) Signed-off-by: Michael Stefaniuc --- dlls/oleaut32/vartype.c | 7 ++++++- include/msvcrt/corecrt_wstdio.h | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/oleaut32/vartype.c b/dlls/oleaut32/vartype.c index 6793de317ac..90b3fcaa1a9 100644 --- a/dlls/oleaut32/vartype.c +++ b/dlls/oleaut32/vartype.c @@ -29,6 +29,8 @@ #include "variant.h" #include "resource.h" +#include "locale.h" + WINE_DEFAULT_DEBUG_CHANNEL(variant); extern HMODULE hProxyDll DECLSPEC_HIDDEN; @@ -6501,12 +6503,15 @@ static BSTR VARIANT_BstrReplaceDecimal(const WCHAR * buff, LCID lcid, ULONG dwFl static HRESULT VARIANT_BstrFromReal(DOUBLE dblIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut, LPCWSTR lpszFormat) { + _locale_t locale; WCHAR buff[256]; if (!pbstrOut) return E_INVALIDARG; - swprintf( buff, ARRAY_SIZE(buff), lpszFormat, dblIn ); + if (!(locale = _create_locale(LC_ALL, "C"))) return E_OUTOFMEMORY; + _swprintf_l(buff, ARRAY_SIZE(buff), lpszFormat, locale, dblIn); + _free_locale(locale); /* Negative zeroes are disallowed (some applications depend on this). If buff starts with a minus, and then nothing follows but zeroes diff --git a/include/msvcrt/corecrt_wstdio.h b/include/msvcrt/corecrt_wstdio.h index 63f411e02db..81238afafb8 100644 --- a/include/msvcrt/corecrt_wstdio.h +++ b/include/msvcrt/corecrt_wstdio.h @@ -181,6 +181,17 @@ static inline int WINAPIV swprintf_s(wchar_t *buffer, size_t size, const wchar_t return ret; } +static inline int WINAPIV _swprintf_l(wchar_t *buffer, size_t size, const wchar_t* format, _locale_t locale, ...) +{ + int ret; + __ms_va_list args; + + __ms_va_start(args, locale); + ret = __stdio_common_vswprintf_s(_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS, buffer, size, format, locale, args); + __ms_va_end(args); + return ret; +} + static inline int __cdecl _vscwprintf(const wchar_t *format, __ms_va_list args) { int ret = __stdio_common_vswprintf(_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS | _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR,