2016-09-07 99 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。 –