@@ -64,8 +64,22 @@ tb_int_t xm_os_strerror(lua_State *lua) {
6464 lua_pushstring (lua , strerr );
6565 } else {
6666#if defined(TB_CONFIG_OS_WINDOWS ) && !defined(TB_COMPILER_LIKE_UNIX )
67- tb_char_t strerr [128 ] = { 0 };
68- tb_snprintf (strerr , sizeof (strerr ), "Unknown Error (%lu)" , (tb_size_t )GetLastError ());
67+ DWORD error_code = GetLastError ();
68+ tb_char_t strerr [128 * 2 ] = { 0 };
69+ tb_wchar_t wstrerr [128 ] = { 0 };
70+ tb_size_t len = 0 ;
71+ if (FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS ,
72+ NULL , error_code , MAKELANGID (LANG_NEUTRAL , SUBLANG_DEFAULT ),
73+ wstrerr , tb_arrayn (wstrerr ), NULL ) &&
74+ (len = tb_wcslen (wstrerr )) > 0 ) {
75+ while (len > 0 && (wstrerr [len - 1 ] == L'\r' || wstrerr [len - 1 ] == L'\n' )) {
76+ wstrerr [-- len ] = L'\0' ;
77+ }
78+ WideCharToMultiByte (CP_UTF8 , 0 , wstrerr , -1 , strerr , sizeof (strerr ), tb_null , tb_null );
79+ }
80+ if (strerr [0 ] == '\0' ) {
81+ tb_snprintf (strerr , sizeof (strerr ), "Unknown Error (%lu)" , (tb_size_t )error_code );
82+ }
6983 lua_pushstring (lua , strerr );
7084#else
7185 lua_pushstring (lua , strerror (errno ));
0 commit comments