我正试图使用TProcess启动TextEdit,给它一个文本文件,该文件刚刚由调用程序编写并关闭,调用程序是在终端上调用的命令行程序。
我第一次运行这个(见下面的摘录),它是有效的。这种情况是指自计算机重新启动以来尚未使用TextEdit。
在此后的每一次试用中,在之前使用过TextEdit之后,TextEdit都会重新收到一条模式错误消息,上面写着:
"The document “DocName.PRN” could not be opened. You don’t have permission."
但使用GetInfo,我发现权限非常正常,而且我不难用TextEdit"手动"打开文件。
因为TextEdit启动并找到了文档,所以我怀疑启动本身是否有任何问题。我确实尝试过同步启动,这并没有改变TextEdit的权限消息,但确实要求我强制退出TextEdit,之后调用程序将挂起(无法终止,但什么也不做)。
有人知道这里发生了什么,以及如何解决它吗?
...
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 );
@Ken Research根据您关于启动服务的建议,说服我FreePascal提供的TProcess类将TextEdit作为新实例启动,而不是使用现有实例(如果有的话)。这造成了有问题的单独休眠进程和权限泄露。这种方法可能在某种程度上适用于具有TProcess跨平台兼容性的Windows环境。当前形式的类不提供控制此行为的选项。因此,让TProcess启动TextEdit不适合我在OS X上的项目。或者,使用带有选项-e的Open命令(强制TextEdit)是解决我这里问题的快速而简单的方法。谢谢你给我的指示。
我的启动代码现在看起来是这样的:
launch( ['/usr/bin/open', '-e',
'/Users/lor/LorDev/LOR/'+DocName+'.PRN'],
Asynchronous );