diff --git a/include/spdlog/common.h b/include/spdlog/common.h index bb251e2f..e7983e3a 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -103,6 +103,7 @@ using err_handler = std::function; using string_view_t = fmt::basic_string_view; using wstring_view_t = fmt::basic_string_view; using memory_buf_t = fmt::basic_memory_buffer; +using wmemory_buf_t = fmt::basic_memory_buffer; using filename_memory_buf_t = fmt::basic_memory_buffer; #ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT diff --git a/include/spdlog/details/os-inl.h b/include/spdlog/details/os-inl.h index 20e6ffa3..e37c0b97 100644 --- a/include/spdlog/details/os-inl.h +++ b/include/spdlog/details/os-inl.h @@ -469,7 +469,7 @@ SPDLOG_INLINE void wstr_to_utf8buf(wstring_view_t wstr, memory_buf_t &target) throw_spdlog_ex(fmt::format("WideCharToMultiByte failed. Last error: {}", ::GetLastError())); } -SPDLOG_INLINE void utf8_to_wstrbuf(string_view_t str, memory_buf_t &target) +SPDLOG_INLINE void utf8_to_wstrbuf(string_view_t str, wmemory_buf_t &target) { if (str.size() > static_cast((std::numeric_limits::max)())) { @@ -484,7 +484,7 @@ SPDLOG_INLINE void utf8_to_wstrbuf(string_view_t str, memory_buf_t &target) } int result_size = static_cast(target.capacity()); - if ((str_size + 1) * 2 < result_size) + if (str_size + 1 > result_size) { result_size = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str.data(), str_size, NULL, 0); } @@ -492,7 +492,7 @@ SPDLOG_INLINE void utf8_to_wstrbuf(string_view_t str, memory_buf_t &target) if (result_size > 0) { target.resize(result_size); - result_size = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str.data(), str_size, (LPWSTR)target.data(), result_size); + result_size = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str.data(), str_size, target.data(), result_size); if (result_size > 0) { diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index 2c6fc91c..9fda1447 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -91,7 +91,7 @@ SPDLOG_API bool in_terminal(FILE *file) SPDLOG_NOEXCEPT; #if (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32) SPDLOG_API void wstr_to_utf8buf(wstring_view_t wstr, memory_buf_t &target); -SPDLOG_API void utf8_to_wstrbuf(string_view_t str, memory_buf_t &target); +SPDLOG_API void utf8_to_wstrbuf(string_view_t str, wmemory_buf_t &target); #endif // Return directory name from given path or empty string diff --git a/include/spdlog/sinks/win_eventlog_sink.h b/include/spdlog/sinks/win_eventlog_sink.h index f154c55a..68170dd9 100644 --- a/include/spdlog/sinks/win_eventlog_sink.h +++ b/include/spdlog/sinks/win_eventlog_sink.h @@ -224,35 +224,22 @@ protected: formatted.push_back('\0'); #ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT - try - { - memory_buf_t buf; - details::os::utf8_to_wstrbuf(string_view_t(formatted.data(), formatted.size()), buf); + wmemory_buf_t buf; + details::os::utf8_to_wstrbuf(string_view_t(formatted.data(), formatted.size()), buf); - LPCWSTR lp_wstr = reinterpret_cast(buf.data()); - succeeded = ::ReportEventW(event_log_handle(), eventlog::get_event_type(msg), eventlog::get_event_category(msg), event_id_, + LPCWSTR lp_wstr = buf.data(); + succeeded = ::ReportEventW(event_log_handle(), eventlog::get_event_type(msg), eventlog::get_event_category(msg), event_id_, current_user_sid_.as_sid(), 1, 0, &lp_wstr, nullptr); - - if (!succeeded) - { - SPDLOG_THROW(win32_error("ReportEvent")); - } - } - catch (...) - { - // WCHAR string conversion can fail and if it does, we shouldn't call to report event function. - } #else - LPCSTR lp_str = reinterpret_cast(formatted.data()); - + LPCSTR lp_str = formatted.data(); succeeded = ::ReportEventA(event_log_handle(), eventlog::get_event_type(msg), eventlog::get_event_category(msg), event_id_, current_user_sid_.as_sid(), 1, 0, &lp_str, nullptr); +#endif if (!succeeded) { SPDLOG_THROW(win32_error("ReportEvent")); } -#endif } void flush_() override {}