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

Как сказал Дэвид, вам нужно запустить программу редактора и передать файл в качестве параметра.

Существует несколько способов сделать это. Это наиболее похоже на вашу текущую функцию:

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 для вас. –

Смежные вопросы