2016-05-08 4 views
0

Ich versuche, TextEdit mit TProcess zu starten, indem ich ihm eine Textdatei gebe, die gerade vom aufrufenden Programm geschrieben und geschlossen wurde, das ein Befehlszeilenprogramm ist, das im Terminal aufgerufen wird.Warum lehnt TextEdit die Berechtigungen eines Dokuments ab, nachdem es über FreePascals TProcess auf Max OS X Terminal gestartet wurde?

Das erste Mal, wenn ich dies (siehe Auszüge unten) ausführen, funktioniert es. Dies ist der Fall, wenn TextEdit seit dem Neustart des Computers noch nicht verwendet wurde.

In jedem weiteren Versuch nach, dass nach TextEdit, bevor sie verwendet wurde, reurns TextEdit eine Nachricht modal Fehler sagen:

"The document “DocName.PRN” could not be opened. You don’t have permission." 

Aber mit GetInfo finde ich die Berechtigungen völlig normal sind, und ich habe keine dificulty Öffnung die Datei mit TextEdit 'manuell'.

Da TextEdit gestartet wird und das Dokument findet, bezweifle ich, dass mit dem Start selbst etwas falsch ist. Ich habe versucht, synchron zu starten, und das änderte nicht die Berechtigungsmeldung von TextEdit, aber forderte mich auf, TextEdit zu erzwingen, woraufhin das aufrufende Programm hängen blieb (nicht beenden, aber nichts tun).

Jeder weiß, was hier vor sich geht, und wie man es repariert?

... 
    procedure launch (prm :array of string; syn :LaunchSyncType); 
    var 
     X :integer; 
     Proc: TProcess; 
    begin 
     Proc := TProcess.Create(nil); 
     with Proc do begin 
      try 
       Executable:= prm[0]; {exe;} 
       for X := 1 to high(prm) do 
        Parameters.Add(prm[X]); 
       InheritHandles := False; 
       for X := 1 to GetEnvironmentVariableCount do 
        Environment.Add(GetEnvironmentString(X)); 
       ShowWindow := swoShow; {used by Windows only} 
       if syn = Synchronous then 
        Options := Options + [poWaitOnExit] 
       else begin {asynchronous} 
        Options := []; 
       end; 
       Execute; 
      finally 
       Free; 
      end; 
     end; 
    end; 
... 
    launch(['/Applications/TextEdit.app/Contents/MacOS/TextEdit', 
      '/Users/lor/LorDev/LOR/DocName.PRN'], 
      Asynchronous); 
+1

Ich bin nicht ganz sicher, ob ich den Anwendungsfall folgte, aber das Problem ist wahrscheinlich zu Sandbox fällig. Wenn ein Sandbox-Prozess einen Subprozess erstellt, erbt der Subprozess die Sandbox, erbt jedoch keine temporären Berechtigungen, die von PowerBox hinzugefügt wurden (das Dialogfeld "Öffnen"). –

+0

@Ken das ist ein interessanter Vorschlag. Ich habe die gleiche Methode (wie oben) einige Male benutzt, andere Programme anrufend, Adobe PDF Reader, den Befehl Öffnen und mehrere Programme, die ich geschrieben habe, und keines hatte ähnliche Probleme. Ich werde jedoch versuchen, InheritHandles auf true zu setzen und zu sehen, was passiert. – Lor

+0

@Ken Das Setzen von 'InheritHandles: = True' hat nichts geholfen. Ich umgebe das Problem für den Augenblick, indem ich '/ usr/bin/open' anstelle von TextEdit starte, aber das funktioniert nur, weil mein Dokumentennamensuffix .PRN ist, das mit TextEdit als der Standard-offene Handler eingerichtet wird. Es wird keinem Dokumentennamensuffix helfen, das keinen geeigneten Standardöffner hat. – Lor

Antwort

0

@Ken Forschung nach Ihrem Vorschlag Launch Services in Bezug auf, überzeugt mich die TProcess Klasse von Freepascal startet TextEdit als neue Instanz vorgesehen, anstatt die vorhandene Instanz verwenden, falls vorhanden. Dies erzeugt die problematischen separaten ruhenden Prozesse und Berechtigungsverletzungen. Dieser Ansatz ist wahrscheinlich für eine Windows-Umgebung geeignet, in der TProcess plattformübergreifende Kompatibilität versucht. Die Klasse in ihrer gegenwärtigen Form bietet keine Möglichkeit, dieses Verhalten zu steuern. Daher ist der Start von TProcess TextEdit für mein Projekt unter OS X ungeeignet. Alternativ dazu kann der Befehl Öffnen mit der Option -e (force TextEdit) eine schnelle und einfache Lösung für mein Problem sein. Danke für die Anweisung, die du mir gegeben hast.

Mein Start-Code sieht nun wie folgt aus:

launch(['/usr/bin/open', '-e', 
     '/Users/lor/LorDev/LOR/'+DocName+'.PRN'], 
     Asynchronous); 
+0

Tprocess auch Modelle * nix perfekt. Was Sie verwenden, ist wahrscheinlich näher an Windows 'shellexecute, die auch nicht von FPC/Lazarus abstrahiert wird. Vielleicht möchten Sie auch Lazarus OpenDocument und ähnliche Funktionen betrachten –

Verwandte Themen