如何阻塞调用ShellExecute函数

agang200008 2008-08-20 06:00:58
如何把ShellExecute做成阻塞式的,等到被打开的文件执行完了才返回
...全文
545 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuihan20e 2008-08-21
  • 打赏
  • 举报
回复
进来学习
liangpei2008 2008-08-21
  • 打赏
  • 举报
回复

如何把ShellExecute做成阻塞式的,等到被打开的文件执行完了才返回
用WaitForSingleObject
例:
---------------------------------------------------------

function WinExecAndWait32(APath: PChar; ACmdShow: Integer;
ATimeout: Longword): Integer;
var
vStartupInfo: TStartupInfo;
vProcessInfo: TProcessInformation;
begin
FillChar(vStartupInfo, SizeOf(TStartupInfo), 0);
with vStartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := ACmdShow;
end;
if CreateProcess(nil, APath, nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil,
vStartupInfo, vProcessInfo) then
Result := WaitForSingleObject(vProcessInfo.hProcess, ATimeout)
else Result := GetLastError;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
WinExecAndWait32('notepad.exe', SW_SHOW, INFINITE);
end;
wooxer 2008-08-21
  • 打赏
  • 举报
回复
function WinExecAndWait32(FileName, Parameters: string; Visibility: integer): integer;
var
dwExitCode: Cardinal;
ExecInfo: TShellExecuteInfo;
begin
ZeroMemory(@ExecInfo, SizeOf(ExecInfo));

with ExecInfo do
begin
cbSize := SizeOf(ExecInfo);
fMask := SEE_MASK_NOCLOSEPROCESS;
lpVerb := 'Open';
lpFile := PChar(FileName);
lpParameters := PChar(Parameters);
nShow := Visibility; //SW_HIDE;
end;

ShellExecuteEx(@ExecInfo);
GetExitCodeProcess(ExecInfo.hProcess, dwExitCode);
while dwExitCode = STILL_ACTIVE do
begin
GetExitCodeProcess(ExecInfo.hProcess, dwExitCode);
Sleep(5);
Application.ProcessMessages;
end;
Result := ExitCode;
CloseHandle(ExecInfo.hProcess);
end;
lake_cx 2008-08-21
  • 打赏
  • 举报
回复
楼主你怎么知道ShellExecute不是调用的CreateProcess?
agang200008 2008-08-21
  • 打赏
  • 举报
回复
你用的是CreateProcess函数的嘛,我说的是采用ShellExecute函数,可不可以阻塞?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧