From 481660af60e9d58110c8b06bdee9267cb75e11be Mon Sep 17 00:00:00 2001 From: Bernd Baumanns Date: Fri, 25 Sep 2020 21:00:42 +0200 Subject: [PATCH] DWORD is always a 32 bit unsigned integer. But "unsigned long" is sometimes a 32 or 64 bits... --- include/fmt/format-inl.h | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h index c84d2c31..e568c917 100644 --- a/include/fmt/format-inl.h +++ b/include/fmt/format-inl.h @@ -25,11 +25,20 @@ #ifdef _WIN32 # include FMT_BEGIN_NAMESPACE +namespace details { + +# if !defined(__LP64__) +using DWORD = unsigned long; +# else +using DWORD = unsigned int; +# endif +// WriteConsoleW should not become visible in global namespace extern "C" { int __stdcall WriteConsoleW(void* hConsoleOutput, const void* lpBuffer, - uint32_t nNumberOfCharsToWrite, - uint32_t* lpNumberOfCharsWritten, void* lpReserved); + DWORD nNumberOfCharsToWrite, + DWORD* lpNumberOfCharsWritten, void* lpReserved); } +} // namespace details FMT_END_NAMESPACE #endif @@ -2895,9 +2904,10 @@ FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { auto fd = _fileno(f); if (_isatty(fd)) { detail::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size())); - auto written = uint32_t(); - if (!WriteConsoleW(reinterpret_cast(_get_osfhandle(fd)), u16.c_str(), - static_cast(u16.size()), &written, nullptr)) { + auto written = details::DWORD(); + if (!details::WriteConsoleW( + reinterpret_cast(_get_osfhandle(fd)), u16.c_str(), + static_cast(u16.size()), &written, nullptr)) { FMT_THROW(format_error("failed to write to console")); } return;