[gelöst]: TProcess - Dateinpfade/Namen und Umlaute

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

[gelöst]: TProcess - Dateinpfade/Namen und Umlaute

Beitrag von musicones »

Hallo,

ich benutze TProcess um ein konsolenbasiertes RawCopy Programm auszuführen.

Ein einfacher Kommandezeilenbefehl sieht wie folgt aus:

Muster: Anwendung.exe Quelldatei Zielpfad

Code: Alles auswählen

 
C:\Portable\RawCopy64.exe "C:\Meine Daten\Eine Datei.png" "C:\Meine kopierten Daten"
 


Wenn das ganze jetzt so aussehen muss (z.B. Umalute im Pfad),

Code: Alles auswählen

 
C:\Portable\RawCopy64.exe "C:\Daten für mich\Eine Datei.png" "C:\Kopierte Daten für mich"
 


dann wird das ganze nicht ausgeführt. Beim Debuggen ist mir aufgefallen, dass die Umlaute ganz anders codiert sind.
Ich vermute mal, dass die genauso codiert übergeben werden, und dass das Problem darstellt.

Auszug aus dem TProcess Create:

Code: Alles auswählen

 
var Cmdline: PChar;
 
...
// Commandline ist vom Typ String
// und wird hier an Cmdline als PChar gesetzt
        if (Commandline = EmptyStr) then Cmdline := nil
        else Cmdline := PChar(Commandline);
 
...
 
// Der Prozess wird hier erstellt
// und verlangt ein PChar Parameter
// Beim Debuggen an dieser Stelle sehe ich, dass die Umlaute anders codiert sind.
 
        HasHandle := CreateProcess(
           Cmd,                    //only-command, e.g. C:\Portable\myapp.exe
           Cmdline,                //cmd-params, e.g. C:\Portable\myapp.exe -h
           @vSecurityAttributes,
           @vSecurityAttributes,
           True,
           NORMAL_PRIORITY_CLASS,
           nil,
           WDir,                //work-dir
           vStartupInfo,
           vProcessInfo);       
 


Um meine Vermutung zu verifizieren, habe ich
1. Eine Datei direkt über die Commandozeile kopiert
2. Beide Ordner umbenannt und die Umlaute entfernt

In beiden Fällen funktioniert das Kopieren der Dateien

Wie kann ich das korrigieren, dass ich ein anständig codiertes PChar an den Process und somit an die Kommandozeile übergeben kann?

Danke und Gruß
Antonio
Zuletzt geändert von musicones am Mi 8. Feb 2017, 10:59, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess - Dateinpfade/Namen und Umlaute

Beitrag von Michl »

UTF8ToWinCP aus der Unit LazUTF8 wäre dein Freund.

Eben probiert, so geht das hier (für Zeichen der Ansicodepage 1252):

Code: Alles auswählen

uses ... process, LazUTF8;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  Proc: TProcess;
begin
  Proc := TProcess.Create(nil);
  try
    Proc.Executable := UTF8ToWinCP('C:\01_TempÖÜ\project1.exe');
    Proc.Options := [poWaitOnExit];
    Proc.Execute;
    ShowMessage('Finished');
  finally
    Proc.Free;
  end;
end;

PS: für Verzeichnisse mit echten Unicodenamen würde ich die Verwendung von TProcessUTF8 empfehlen! Sieht dann so aus:

Code: Alles auswählen

uses ..., process, UTF8Process;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  Proc: TProcessUTF8;
begin
  Proc := TProcessUTF8.Create(nil);
  try
    Proc.Executable := 'C:\01_Tempόσμεコン\project1.exe';
    Proc.Options := [poWaitOnExit];
    Proc.Execute;
    ShowMessage('Finished');
  finally
    Proc.Free;
  end;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: [gelöst]: TProcess - Dateinpfade/Namen und Umlaute

Beitrag von musicones »

Vielen Dank, das wars. Perfekt!

Antworten