diff --git a/src/lib_c/x86_64-windows-msvc/c/winbase.cr b/src/lib_c/x86_64-windows-msvc/c/winbase.cr index 82af52a8775a..6fb4c3620bf0 100644 --- a/src/lib_c/x86_64-windows-msvc/c/winbase.cr +++ b/src/lib_c/x86_64-windows-msvc/c/winbase.cr @@ -13,9 +13,8 @@ lib LibC FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000_u32 FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000_u32 - # TODO: Use LPWSTR - fun FormatMessageA(dwFlags : DWORD, lpSource : Void*, dwMessageId : DWORD, dwLanguageId : DWORD, - lpBuffer : LPSTR, nSize : DWORD, arguments : Void*) : DWORD + fun FormatMessageW(dwFlags : DWORD, lpSource : Void*, dwMessageId : DWORD, dwLanguageId : DWORD, + lpBuffer : LPWSTR, nSize : DWORD, arguments : Void*) : DWORD struct FILETIME dwLowDateTime : DWORD diff --git a/src/winerror.cr b/src/winerror.cr index 6d011a654212..c52af4fc5d07 100644 --- a/src/winerror.cr +++ b/src/winerror.cr @@ -8,9 +8,9 @@ class WinError < Errno end def initialize(message, code) - buffer = uninitialized UInt8[256] - size = LibC.FormatMessageA(LibC::FORMAT_MESSAGE_FROM_SYSTEM, nil, code, 0, buffer, buffer.size, nil) - details = String.new(buffer.to_unsafe, size).strip + buffer = uninitialized UInt16[256] + size = LibC.FormatMessageW(LibC::FORMAT_MESSAGE_FROM_SYSTEM, nil, code, 0, buffer, buffer.size, nil) + details = String.from_utf16(buffer.to_slice[0, size]).strip super("#{message}: [WinError #{code}, #{details}]", winerror_to_errno(code)) end