2016-05-28 6 views
1

Ich bekomme von anderen statckoverflow post die unten aufgeführte Funktion.App Konsole Ausgabe und korrekte Codierung zu TMemo in Delphi

Ich habe ein Codierungsproblem mit akzentuierten Zeichen, um das Ergebnis in einem TMemo anzuzeigen. wenn ich für Probe verwenden:

Memo1.Text := GetDosOutput('Help DIR'); 

Mein Memo1.Text zeigt:

"Exibe uma lista de arquivos e subdiret¢rios em um diret¢rio. 
DIR [unidade:][caminho][arquivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N] 
    [/O[[:]ordem_de_classifica‡Æo]] [/P] [/Q] [/R] [/S] [/T[[:]campo_de_tempo]] 
    [/W] [/X] [/4] 
    ....... 
" 

Bitte Wie konvertiere ich das Ergebnis String der Funktion zeigt korrekt in TMemo?

Ich versuchte

Memo1.Text := UnicodeString(GetDosOutput('Help DIR')); 

aber keinen Blick.

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string; 
var 
    SA: TSecurityAttributes; 
    SI: TStartupInfo; 
    PI: TProcessInformation; 
    StdOutPipeRead, StdOutPipeWrite: THandle; 
    WasOK: Boolean; 
    Buffer: array[0..255] of AnsiChar; 
    BytesRead: Cardinal; 
    WorkDir: string; 
    Handle: Boolean; 
begin 
    Result := ''; 
    with SA do begin 
    nLength := SizeOf(SA); 
    bInheritHandle := True; 
    lpSecurityDescriptor := nil; 
    end; 
    CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0); 
    try 
    with SI do 
    begin 
     FillChar(SI, SizeOf(SI), 0); 
     cb := SizeOf(SI); 
     dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
     wShowWindow := SW_HIDE; 
     hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin 
     hStdOutput := StdOutPipeWrite; 
     hStdError := StdOutPipeWrite; 
    end; 
    WorkDir := Work; 
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), 
          nil, nil, True, 0, nil, 
          PChar(WorkDir), SI, PI); 
    CloseHandle(StdOutPipeWrite); 
    if Handle then 
     try 
     repeat 
      WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); 
      if BytesRead > 0 then 
      begin 
      Buffer[BytesRead] := #0; 
      Result :=Result + Buffer; 
      end; 
     until not WasOK or (BytesRead = 0); 
     WaitForSingleObject(PI.hProcess, INFINITE); 
     finally 
     CloseHandle(PI.hThread); 
     CloseHandle(PI.hProcess); 
     end; 
    finally 
    CloseHandle(StdOutPipeRead); 
    end; 
end; 
+0

Was ist damit falsch ist? Welches Ergebnis erwartest du? –

+1

Konsole gibt Text in der OEM-Zeichensatzcodierung zurück. Sie möchten es entweder in eine bestimmte ANSI-Codepage konvertieren (wahrscheinlich 1252 von dem, was gegeben wird: 'ó'>' ¢ ') oder in Unicode, abhängig von der Version von Delphi, die Sie verwenden. Sie können entweder 'OEMToCharBuff' verwenden oder mit' TEncoding' konvertieren. –

+1

@JerryDodge ist es ziemlich offensichtlich - er erwartet 'subdiretórios' und bekommt' subdiret ¢ rios'. –

Antwort

1

Von J .. Vorschlag, habe ich die StrOemToAnsi Funktion unter Verwendung OemToCharBuffA zeigt.

Um zu testen, ich tat:

procedure Tfm_nh_maindicom.Button1Click(Sender: TObject); 
var s:string; 
    function StrOemToAnsi(const aStr : AnsiString) : AnsiString; 
    var 
     Len : Integer; 
    begin 
     if aStr = '' then Exit; 
     Len := Length(aStr); 
     SetLength(Result, Len); 
     OemToCharBuffA(PAnsiChar(aStr), PAnsiChar(Result), Len); 
    end; 
begin 
    S:=GetDosOutput('Help DIR'); 
    Memo1.Text:=StrOemToAnsi(s); 
end; 

Und das Ergebnis in Memo1 war:

"Exibe uma lista de arquivos e subdiretórios em um diretório. 

DIR [unidade:][caminho][arquivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N] 
    [/O[[:]ordem_de_classificação]] [/P] [/Q] [/R] [/S] [/T[[:]campo_de_tempo]] 
    [/W] [/X] [/4] 
.... 
"