2016-05-08 3 views
0

私は、TProcessを使ってTextEditを起動しようとしていますが、Terminal上で起動されたコマンドラインプログラムである呼び出し側プログラムによって書き込まれ、閉じられたテキストファイルを与えています。Mac OS X TerminalでFreePascalのTProcessを使用して起動した後、TextEditがドキュメントの権限を拒否するのはなぜですか?

これを初めて実行すると(以下の抜粋を参照)、動作します。この場合は、コンピュータを再起動してからTextEditがまだ使用されていない場合です。

​​

しかし、GetInfoはを使用して、私は権限が完全に正常で見つけ、そして私はdificulty開口部を持っていない:テキストエディットは、以前に使用された後、その後、後続のすべての試験では

は、テキストエディットは言っモーダルエラーメッセージをreurns 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); 
+1

私は、ユースケースを追った完全にわからないんだけど、問題はおそらく、サンドボックスによるものです。サンドボックスプロセスがサブプロセスを作成すると、サブプロセスはサンドボックスを継承しますが、PowerBox(開いているダイアログ)によって追加された一時的なアクセス権は継承されません。 –

+0

@Kenそれは興味深い提案です。私は他のプログラム、AdobeのPDF Reader、Openコマンド、および私が書いたいくつかのプログラムを呼び出すのと同じ方法を(上記と同じように)数回使いましたが、どれも同じ問題を抱えていませんでした。しかし、私はInheritHandlesをtrueに設定しようとして、何が起こるか見てみましょう。 – Lor

+0

@Ken 'InheritHandles:= True'を設定しても何の助けにもなりませんでした。私はTextEditの代わりに '/ usr/bin/open'を起動することで問題を回避していますが、ドキュメント名の接尾辞がデフォルトのオープンハンドラとしてTextEditで設定されている.PRNなので動作します。これは、適切なデフォルトオープナを持たないドキュメント名の接尾辞を助けるものではありません。 – Lor

答えて

0

@Ken研究打上げサービスに関するご提案を、以下、FreePascalとによって提供されるように私のTプロセスのクラスを説得があれば、むしろ既存のインスタンスを使用するよりも、新しいインスタンスとしてテキストエディットを起動します。これにより、問題のある独立した休止プロセスとアクセス権違反が発生します。このアプローチは、TProcessがクロスプラットフォームとの互換性を試行しているWindows環境にはおそらく適切です。現在の形式のクラスは、この振る舞いを制御するオプションを提供しません。したがって、TProcessの起動TextEditは、OS X上の自分のプロジェクトには適していません。代わりに、-e(強制テキストエディット)オプションを使用してOpenコマンドを使用すると、ここでの問題をすばやく簡単に解決できます。あなたが私に与えた方向性に感謝します。

マイ起動コードは次のようになります。

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

Tprocessも* nixを完全にモデル化しています。あなたが使用しているものはおそらくFPC/Lazarusによって抽象化されていないWindowsのshellexecuteに近いでしょう。 LazarusのOpenDocumentと同様の機能を見たいかもしれません –

関連する問題