2016-09-07 7 views
1

現在、私はデフォルトのエディタを使ってファイルを開き、ユーザがエディタウィンドウを閉じるまで私のアプリケーションが待つように、次の関数を使用しています。指定したエディタを使ってファイルを編集するには?

function EditAndWait(const AFileName : string) : boolean; 
var 
    Info: TShellExecuteInfo; 
begin 
    FillChar(Info, SizeOf(Info), 0); 
    Info.cbSize := SizeOf(Info); 
    Info.lpVerb := 'edit'; 
    Info.lpFile := PAnsiChar(AFileName); 
    Info.nShow := SW_SHOW; 
    Info.fMask := SEE_MASK_NOCLOSEPROCESS; 
    Result := ShellExecuteEx(@Info); 
    if(Result) and (Info.hProcess <> 0) then 
    begin 
    WaitForSingleObject(Info.hProcess, Infinite); 
    CloseHandle(Info.hProcess); 
    end; 
end; 

編集に使用するエディタ実行ファイルを指定できるような同様の機能を記述したいと思います。

function EditAndWait(const AFileName : string; const AEditor : string) : boolean; 
begin 
    //... 
end; 
+1

ファイルを引数として渡すエディタでプロセスを作成します。それが閉じるのを待ちます。どちらの部分も検索で見つかる多くの例があります。 –

+1

[CreateProcess](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v = vs.85).aspx)関数を見てください。 – Sam

+2

コードにリソースリークがあります。後でプロセスハンドルを閉じることを忘れないでください。 –

答えて

2

Davidが言ったように、エディタプログラムを実行し、ファイルをパラメータとして渡す必要があります。

いくつかの方法があります。これは現在の関数に最もよく似ています:

function EditAndWait(const AFileName : string; const AEditor : string) : boolean; 
var 
    Info: TShellExecuteInfo; 
begin 
    FillChar(Info, SizeOf(Info), 0); 
    Info.cbSize := SizeOf(Info); 
    Info.lpVerb := 'open'; 
    Info.lpFile := PChar(AEditor); 
    Info.nShow := SW_SHOW; 
    Info.fMask := SEE_MASK_NOCLOSEPROCESS; 
    Info.lpParameters := PChar(AFileName); 
    Result := ShellExecuteEx(@Info); 
    if(Result) and (Info.hProcess <> 0) then 
    begin 
    CloseHandle(Info.hProcess); 
    WaitForSingleObject(Info.hProcess, Infinite); 
    end; 
end; 
+0

追加するには、空の文字列に 'AEditor'をデフォルト設定します。この関数を省略して呼び出すと、デフォルトのものが呼び出されます。そうすれば、2つの別々の機能は必要ありません。 –

+2

エラーチェックを無視するのは間違いです。私はCreateProcessを使用して、あなたのためにCPを呼び出すためにSEEを得る家の周りに行くのを避けます。 –

関連する問題