2016-09-07 72 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

忽略錯誤檢查是一個錯誤。我也會使用CreateProcess,避免繞SEE給你打電話給CP。 –