[fpc-devel] UTF8 support for win\process.inc

Michael Thompson mike.cornflake at gmail.com
Tue Jul 1 16:50:19 CEST 2014


Apologies, I forgot to include a link to just the patch...

https://dl.dropboxusercontent.com/u/59503182/fpc/process.inc.patch

Mike T


On 1 July 2014 16:45, Michael Thompson <mike.cornflake at gmail.com> wrote:

> G'day,
>
> I'm on Windows 8/Trunk FPC
>
> Been banging my head against the wall all weekend trying to get some UTF8
> working with the LazUtils TProcessUTF8.  By the end of that I realized no
> matter what I did there, I wasn't going to get anywhere.
>
> I've now solved my problem using only TProcess.  See below for the
> modified TProcess.Execute (win\process.inc)
>
> Procedure TProcess.Execute;
> Var
>   i : Integer;
>   PName,PDir,PCommandLine : PWideChar;     // Changed from PChar
>   FEnv: pointer;
>   FCreationFlags : Cardinal;
>   FProcessAttributes : TSecurityAttributes;
>   FThreadAttributes : TSecurityAttributes;
>   FProcessInformation : TProcessInformation;
>   FStartupInfo : STARTUPINFO;
>   HI,HO,HE : THandle;
>   Cmd : String;
>
> begin
>   PName:=Nil;
>   PCommandLine:=Nil;
>   PDir:=Nil;
>
>   if (FApplicationName='') and (FCommandLine='') and (FExecutable='') then
>     Raise EProcess.Create(SNoCommandline);
>   if (FApplicationName<>'') then
>     begin
>     PName:=PWideChar(UTF8Decode(FApplicationName));   // Added UTF8Decode
>     PCommandLine:=PWideChar(UTF8Decode(FCommandLine));// Added UTF8Decode
>     end
>   else If (FCommandLine<>'') then
>     PCommandLine:=PWideChar(UTF8Decode(FCommandLine)) // Added UTF8Decode
>   else if (Fexecutable<>'') then
>     begin
>     Cmd:=MaybeQuoteIfNotQuoted(Executable);
>     For I:=0 to Parameters.Count-1 do
>       Cmd:=Cmd+' '+MaybeQuoteIfNotQuoted(Parameters[i]);
>     PCommandLine:=PWideChar(UTF8Decode(Cmd));         // Added UTF8Decode
>     end;
>   If FCurrentDirectory<>'' then
>     PDir:=PWideChar(UTF8Decode(FCurrentDirectory));   // Added UTF8Decode
>   if FEnvironment.Count<>0 then
>     FEnv:=StringsToPChars(FEnvironment)
>   else
>     FEnv:=Nil;
>   Try
>     FCreationFlags:=GetCreationFlags(Self);
>     InitProcessAttributes(Self,FProcessAttributes);
>     InitThreadAttributes(Self,FThreadAttributes);
>     InitStartupInfo(Self,FStartUpInfo);
>     If poUsePipes in FProcessOptions then
>       CreatePipes(HI,HO,HE,FStartupInfo,Not(poStdErrToOutPut in
> FProcessOptions), FPipeBufferSize);
>     Try
>       If Not
> CreateProcessW(PName,PCommandLine, at FProcessAttributes, at FThreadAttributes,
>                    FInheritHandles,FCreationFlags,FEnv,PDir,FStartupInfo,
>                    fProcessInformation) then
>              // Changed to CreateProcessW
>         Raise
> EProcess.CreateFmt(SErrCannotExecute,[FCommandLine,GetLastError]);
>       FProcessHandle:=FProcessInformation.hProcess;
>       FThreadHandle:=FProcessInformation.hThread;
>       FProcessID:=FProcessINformation.dwProcessID;
>     Finally
>       if POUsePipes in FProcessOptions then
>         begin
>         FileClose(FStartupInfo.hStdInput);
>         FileClose(FStartupInfo.hStdOutput);
>         if Not (poStdErrToOutPut in FProcessOptions) then
>           FileClose(FStartupInfo.hStdError);
>         CreateStreams(HI,HO,HE);
>         end;
>     end;
>     FRunning:=True;
>   Finally
>     If FEnv<>Nil then
>       FreeMem(FEnv);
>   end;
>   if not (csDesigning in ComponentState) and // This would hang the IDE !
>      (poWaitOnExit in FProcessOptions) and
>       not (poRunSuspended in FProcessOptions) then
>     WaitOnExit;
> end;
>
> Basically I changed 3 x PChar to PWideChar, then when the PWideChars are
> being set I do it via PWideChar(UTF8Decode(<string>))
> Finally I changed CreateProcess to CreateProcessW.
>
> I had thought I was going to need to change the datatypes for FCommandline
> etc, but this wasn't the case.
>
> With the limited testing I've done, this seems to successfully enable UTF8
> support within TProcess, without the end user needing to change any of
> their code.  Also, this doesn't seem to break any existing code that uses
> TProcess.
>
> Before I submit this as a patch though, I have concerns.  Mainly around a)
> not knowing your development plans in this area and b) me not really
> knowing unicode (just because this works, doesn't mean it's right).
>
> A summary of my concerns:
> * I note in redef.inc there is already a redirect for CreateProcess to
> CreateProcessW.  This implies to me there is already a plan in mind, and I
> might be cutting across that by directly calling CreateProcessW.
> * My code doesn't take UTF16 into account.  In truth, I'm not sure how to
> do that.
> * I've only done limited testing on a Win 8 64bit PC set to Australian
> regional settings.  Really I think I need to test this on a wide variety of
> regional settings and across a variety of Win OS's...
>
> Before I submit a patch based on this can anyone tell me if I'm on the
> wrong track? (and if so, where)
>
> Many thanks
>
> Mike Thompson
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20140701/ffb8994a/attachment.html>


More information about the fpc-devel mailing list