فهرست منبع

* To be more compatible, it is better to leave argv as ANSI only.

git-svn-id: branches/unicodertl@12193 -
yury 17 سال پیش
والد
کامیت
b28ebf4793
1فایلهای تغییر یافته به همراه38 افزوده شده و 12 حذف شده
  1. 38 12
      rtl/win32/system.pp

+ 38 - 12
rtl/win32/system.pp

@@ -115,9 +115,9 @@ const
   Dll_Thread_Detach_Hook : TDLL_Entry_Hook = nil;
 
 function CmdLine: PRtlChar;
-{ C compatible arguments }
+{ C compatible arguments ANSI only}
 function argc: longint;
-function argv: PPRtlChar;
+function argv: PPAnsiChar;
 
 implementation
 
@@ -158,11 +158,14 @@ function SysReAllocStringLen(var bstr:pointer;psz: pointer;
 var
   FArgs: PRtlChar;
   FCmdLine: PRtlChar;
-{$ifndef FPC_RTLSTRING_UTF16}
-  FCmdLineStr: RtlString;
-{$endif FPC_RTLSTRING_UTF16}
   Fargc: longint;
   Fargv: PPRtlChar;
+{$ifdef FPC_RTLSTRING_UTF16}
+  FAnsiArgs: PAnsiChar;
+  FAnsiArgv: PPAnsiChar;
+{$else}
+  FCmdLineStr: RtlString;
+{$endif FPC_RTLSTRING_UTF16}
 
 procedure setup_arguments;
 var
@@ -194,7 +197,7 @@ begin
 {$endif FPC_RTLSTRING_UTF16}
   Inc(i);
   // Alloc space for arguments
-  FArgs:=SysGetMem((i + strlen(FCmdLine) + 1)*SizeOf(RtlChar));
+  FArgs:=SysGetMem((i + strlen(FCmdLine) + 2)*SizeOf(RtlChar));
   // Copy exe name
   Move(buf, FArgs^, i*SizeOf(RtlChar));
   Fargv[0]:=FArgs;
@@ -255,6 +258,9 @@ begin
 
       Inc(Fargc);
    end;
+   // Terminate FArgs with double null
+   dst^:=#0;
+   Inc(dst);
    // Truncate buffers
    SysReAllocMem(FArgs, pointer(dst) - pointer(FArgs));
    SysReAllocMem(Fargv, Fargc*SizeOf(pointer));
@@ -272,12 +278,6 @@ begin
   Result:=Fargc;
 end;
 
-function argv: PPRtlChar;
-begin
-  setup_arguments;
-  Result:=Fargv;
-end;
-
 function paramcount : longint;
 begin
   paramcount := argc - 1;
@@ -292,6 +292,28 @@ begin
     paramstr:='';
 end;
 
+function argv: PPAnsiChar;
+var
+  s: AnsiString;
+  i, j, len: cardinal;
+begin
+  if FAnsiArgv = nil then begin
+    setup_arguments;
+    FAnsiArgv:=SysGetMem((ParamCount + 1)*SizeOf(pointer));
+    len:=0;
+    for i:=0 to ParamCount do begin
+      s:=ParamStr(i);
+      j:=Length(s) + 1;
+      SysReAllocMem(FAnsiArgs, len + j);
+      Move(s[1], FAnsiArgs[len], j);
+      FAnsiArgv[i]:=pointer(len);
+      Inc(len, j);
+    end;
+    for i:=0 to ParamCount do
+      FAnsiArgv[i]:=pointer(FAnsiArgs) + ptruint(FAnsiArgv[i]);
+  end;
+  Result:=FAnsiArgv;
+end;
 
 procedure randomize;
 begin
@@ -1093,6 +1115,10 @@ initialization
 finalization
   SysFreeMem(FArgs);
   SysFreeMem(FArgv);
+{$ifdef FPC_RTLSTRING_UTF16}
+  SysFreeMem(FAnsiArgs);
+  SysFreeMem(FAnsiArgv);
+{$endif FPC_RTLSTRING_UTF16}
 
 end.