From: Jacek Caban Subject: [PATCH] oleaut32: Use C locale in VARIANT_BstrReplaceDecimal. Message-Id: <206f4e9a-d9b8-f402-785c-02a48ebf587f@codeweavers.com> Date: Tue, 16 Feb 2021 15:50:51 +0100 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50672 Signed-off-by: Jacek Caban --- dlls/oleaut32/vartype.c | 7 ++++++- include/msvcrt/corecrt_wstdio.h | 11 +++++++++++ include/msvcrt/locale.h | 1 + 3 files changed, 18 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, diff --git a/include/msvcrt/locale.h b/include/msvcrt/locale.h index d2963813475..df4ded0139e 100644 --- a/include/msvcrt/locale.h +++ b/include/msvcrt/locale.h @@ -91,6 +91,7 @@ _ACRTIMP int __cdecl _configthreadlocale(int); _ACRTIMP _locale_t __cdecl _get_current_locale(void); _ACRTIMP _locale_t __cdecl _create_locale(int, const char*); _ACRTIMP void __cdecl _free_locale(_locale_t); +_ACRTIMP _locale_t __cdecl _wcreate_locale(int, const wchar_t*); #ifndef _WLOCALE_DEFINED #define _WLOCALE_DEFINED