为什么 TextEdit 在通过 Max OS X 终端上的 FreePascal 的 TProcess 启动文档后会拒绝文档的权限?



我正试图使用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 );

最新更新