diff --git a/include/spdlog/sinks/win_eventlog_sink.h b/include/spdlog/sinks/win_eventlog_sink.h index 384fa9eb..7b50b7b5 100644 --- a/include/spdlog/sinks/win_eventlog_sink.h +++ b/include/spdlog/sinks/win_eventlog_sink.h @@ -55,20 +55,34 @@ struct win32_error : public spdlog_ex { std::string system_message; + auto fFormatResult = [&system_message](bool format_message_succeeded, void* format_message_result) + { + if (format_message_succeeded && format_message_result) + { + system_message = fmt::format(" ({})", format_message_result); + } + + if (format_message_result) + { + LocalFree((HLOCAL)format_message_result); + } + }; + +#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT + LPWSTR format_message_result{}; + auto format_message_succeeded = + ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, + error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&format_message_result, 0, nullptr); + + fFormatResult(format_message_succeeded, format_message_result); +#else LPSTR format_message_result{}; auto format_message_succeeded = - ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, + ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&format_message_result, 0, nullptr); - if (format_message_succeeded && format_message_result) - { - system_message = fmt::format(" ({})", format_message_result); - } - - if (format_message_result) - { - LocalFree((HLOCAL)format_message_result); - } + fFormatResult(format_message_succeeded, format_message_result); +#endif return fmt::format("{}: {}{}", user_message, error_code, system_message); } @@ -203,7 +217,7 @@ private: { if (!hEventLog_) { - hEventLog_ = ::RegisterEventSource(nullptr, source_.c_str()); + hEventLog_ = ::RegisterEventSourceA(nullptr, source_.c_str()); if (!hEventLog_ || hEventLog_ == (HANDLE)ERROR_ACCESS_DENIED) { SPDLOG_THROW(internal::win32_error("RegisterEventSource")); @@ -218,13 +232,22 @@ protected: { using namespace internal; + bool succeeded; memory_buf_t formatted; base_sink::formatter_->format(msg, formatted); formatted.push_back('\0'); - LPCSTR lp_str = static_cast(formatted.data()); - auto succeeded = ::ReportEvent(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); +#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT + LPCWSTR lp_str = reinterpret_cast(formatted.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_str, nullptr); +#else + LPCSTR lp_str = reinterpret_cast(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) {