所以我试着用 Delphi 和ShellExecuteEx做一个归档我的代码是:
Result := False;
DecodeDate(now,y,m,d);
NumeFisier := dir+'\Export_'+IntToStr(y)+'.'+IntToStr(m)+'.'+IntToStr(d)+'.zip';
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
exInfo.lpVerb := nil;
exInfo.lpFile := PAnsiChar('C:\Windows\System32\cmd.exe');
exInfo.lpParameters := PAnsiChar('C:\Program Files\7-Zip\7z.exe ' +'a ' + NumeFisier + ' ' + dir);
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@exInfo) then
Ph := exInfo.hProcess
else
begin
ShowMessage(SysErrorMessage(GetLastError));
Result := true;
exit;
end;
while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(Ph);
Result := true;
由于某种原因,这只打开命令提示符,而不执行存档。我如何才能使它执行7z.exe文件。
我尝试使用ShellExecute,它工作得很好,但是我必须检查进程是否完成,所以我坚持使用ShellExecuteEx
1条答案
按热度按时间omjgkv6w1#
不需要用到
cmd.exe
,它是命令解释器,如果你想执行一个不同的可执行文件,直接执行吧。您不希望使用
ShellExecuteEx
,因为它的通用性远远超出您的需要。ShellExecuteEx
在这里所做的一切就是调用CreateProcess
。您应该直接调用CreateProcess
,避免中间人。此外,调用CreateProcess
可以让您轻松隐藏控制台窗口。通过CREATE_NO_WINDOW
来实现这一点。最后,还有比你的代码更好的等待方式。使用
MsgWaitForMultipleObjects
可以避免轮询。将这段代码放到线程中可以避免调用Application.ProcessMessages
。