浏览代码

win32: SysErrorMessage: ignore inserts (when not used the messages with inserts are empty) and allocate message buffer

git-svn-id: trunk@47748 -
(cherry picked from commit 6eb37beb2420409c9e113b06fb651c9cb91c7e72)
ondrej 4 年之前
父节点
当前提交
a67b55f7fe
共有 1 个文件被更改,包括 11 次插入10 次删除
  1. 11 10
      rtl/win/sysutils.pp

+ 11 - 10
rtl/win/sysutils.pp

@@ -1406,25 +1406,26 @@ end;
 ****************************************************************************}
 ****************************************************************************}
 
 
 function SysErrorMessage(ErrorCode: Integer): String;
 function SysErrorMessage(ErrorCode: Integer): String;
-const
-  MaxMsgSize = Format_Message_Max_Width_Mask;
 var
 var
-  MsgBuffer: unicodestring;
+  MsgBuffer: PWideChar;
+  Msg: UnicodeString;
   len: longint;
   len: longint;
 begin
 begin
-  SetLength(MsgBuffer, MaxMsgSize);
-  len := FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
+  len := FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM or
+                        FORMAT_MESSAGE_IGNORE_INSERTS or
+                        FORMAT_MESSAGE_ALLOCATE_BUFFER,
                         nil,
                         nil,
                         ErrorCode,
                         ErrorCode,
                         MakeLangId(LANG_NEUTRAL, SUBLANG_DEFAULT),
                         MakeLangId(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                        PUnicodeChar(MsgBuffer),
-                        MaxMsgSize,
+                        PWideChar(@MsgBuffer),
+                        0,
                         nil);
                         nil);
   // Remove trailing #13#10
   // Remove trailing #13#10
-  if (len > 1) and (MsgBuffer[len - 1] = #13) and (MsgBuffer[len] = #10) then
+  if (len > 1) and (MsgBuffer[len - 2] = #13) and (MsgBuffer[len - 1] = #10) then
     Dec(len, 2);
     Dec(len, 2);
-  SetLength(MsgBuffer, len);
-  Result := MsgBuffer;
+  SetString(Msg, PUnicodeChar(MsgBuffer), len);
+  LocalFree(HLOCAL(MsgBuffer));
+  Result := Msg;
 end;
 end;
 
 
 {****************************************************************************
 {****************************************************************************