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);
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"). –
@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
@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