Changed format_windows_error to not need LocalFree

This is for non-'Desktop' applications that have a
more limited collection of functions.
This commit is contained in:
Michael Winterberg 2016-03-02 17:35:34 -08:00
parent 3ecad55910
commit 2a05a87fe7

View File

@ -588,27 +588,25 @@ FMT_FUNC void fmt::WindowsError::init(
FMT_FUNC void fmt::internal::format_windows_error( FMT_FUNC void fmt::internal::format_windows_error(
fmt::Writer &out, int error_code, fmt::Writer &out, int error_code,
fmt::StringRef message) FMT_NOEXCEPT { fmt::StringRef message) FMT_NOEXCEPT {
class String {
private:
LPWSTR str_;
public:
String() : str_() {}
~String() { LocalFree(str_); }
LPWSTR *ptr() { return &str_; }
LPCWSTR c_str() const { return str_; }
};
FMT_TRY { FMT_TRY {
String system_message; MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer;
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | buffer.resize(INLINE_BUFFER_SIZE);
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, for (;;) {
error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), wchar_t *system_message = &buffer[0];
reinterpret_cast<LPWSTR>(system_message.ptr()), 0, 0)) { int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
UTF16ToUTF8 utf8_message; 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
if (utf8_message.convert(system_message.c_str()) == ERROR_SUCCESS) { system_message, static_cast<uint32_t>(buffer.size()), 0);
out << message << ": " << utf8_message; if (result != 0) {
return; UTF16ToUTF8 utf8_message;
if (utf8_message.convert(system_message) == ERROR_SUCCESS) {
out << message << ": " << utf8_message;
return;
}
break;
} }
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
break; // Can't get error message, report error code instead.
buffer.resize(buffer.size() * 2);
} }
} FMT_CATCH(...) {} } FMT_CATCH(...) {}
fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32.