WaitForSingleObject问题

tjj5203 2010-03-09 07:04:23
程序想实现如下功能:
调用cmd.exe,然后等他运行完后程序才继续执行。

MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);
//后续的操作

我的代码如上,但是WaitForSingleObject阻塞不了?
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjj5203 2010-03-09
  • 打赏
  • 举报
回复
谢谢了, ShellExecuteEx是可以了
kfcoffe 2010-03-09
  • 打赏
  • 举报
回复
记得uses
shellapi
kfcoffe 2010-03-09
  • 打赏
  • 举报
回复
引用 4 楼 tjj5203 的回复:
引用 3 楼 kfcoffe 的回复:引用楼主 tjj5203 的回复: 程序想实现如下功能:调用cmd.exe,然后等他运行完后程序才继续执行。 MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe'); WaitForSingleObject(MyHandle, INFINITE); //后续的操作 我的代码如上,但是WaitForSingleObject阻塞不了? 呵呵,不好意思,你这里是可以这样地MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe'); WaitForSingleObject(MyHandle, INFINITE); 具体不等待就执行了,是因为你这个的句柄根本不存在。你可以用这个ShellExecute嘛
我是要等到cmd.exe执行完啊,用shellExecute也不能阻塞程序的执行,相当于两个进程独立在运行


你说的不能阻塞么?


给你代码,你调试试下:

procedure TForm1.Button3Click(Sender: TObject);
var
ShellExInfo: TShellExecuteInfo;
Bo : Boolean;
begin
FillChar(ShellExInfo, SizeOf(ShellExInfo), 0);
with ShellExInfo do begin
cbSize := SizeOf(ShellExInfo);
fMask := see_Mask_NoCloseProcess;
Wnd := Application.Handle;
lpFile := PChar('C:\Program Files\Internet Explorer\IEXPLORE.EXE');
lpParameters := PChar('http://www.baidu.com');
nShow := sw_ShowNormal;
end;
Bo := ShellExecuteEx(@ShellExInfo);
if Bo then
WaitForSingleObject(ShellExInfo.HProcess, INFINITE);

end;



tjj5203 2010-03-09
  • 打赏
  • 举报
回复
少了这句。。。。st.wShowWindow :=sw_show;
tjj5203 2010-03-09
  • 打赏
  • 举报
回复
CreateProcess(nil,'C:\windows\system32\cmd.exe',nil,nil,False,0,nil,nil,StartupInfo,ProcessInfo);
为什么这样不行呢?
tjj5203 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 kfcoffe 的回复:
引用楼主 tjj5203 的回复:
程序想实现如下功能:
调用cmd.exe,然后等他运行完后程序才继续执行。

MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);
//后续的操作

我的代码如上,但是WaitForSingleObject阻塞不了?

呵呵,不好意思,你这里是可以这样地MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);


具体不等待就执行了,是因为你这个的句柄根本不存在。你可以用这个ShellExecute嘛

还有为什么这个句柄不存在啊????
gyk120 2010-03-09
  • 打赏
  • 举报
回复
var
st:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
fillchar(st,sizeof(st),#0);
st.cb :=sizeof(STARTUPINFO);
st.dwFlags :=STARTF_USESHOWWINDOW;
st.wShowWindow :=sw_show;

CreateProcess(nil,pchar('C:\Program Files\Internet Explorer\IEXPLORE.EXE http://www.coolmelife.com'),
nil,nil,false,CREATE_NEW_CONSOLE,nil,nil,st,pi);
tjj5203 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 kfcoffe 的回复:
引用楼主 tjj5203 的回复:
程序想实现如下功能:
调用cmd.exe,然后等他运行完后程序才继续执行。

MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);
//后续的操作

我的代码如上,但是WaitForSingleObject阻塞不了?

呵呵,不好意思,你这里是可以这样地MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);


具体不等待就执行了,是因为你这个的句柄根本不存在。你可以用这个ShellExecute嘛

我是要等到cmd.exe执行完啊,用shellExecute也不能阻塞程序的执行,相当于两个进程独立在运行
kfcoffe 2010-03-09
  • 打赏
  • 举报
回复
引用楼主 tjj5203 的回复:
程序想实现如下功能:
调用cmd.exe,然后等他运行完后程序才继续执行。

MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);
//后续的操作

我的代码如上,但是WaitForSingleObject阻塞不了?


呵呵,不好意思,你这里是可以这样地MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);


具体不等待就执行了,是因为你这个的句柄根本不存在。你可以用这个ShellExecute嘛

tjj5203 2010-03-09
  • 打赏
  • 举报
回复
我本来想用createprocess打开cmd.exe的,但是就是不成功。。。。。。
楼上的能写下看看吗?
kfcoffe 2010-03-09
  • 打赏
  • 举报
回复
引用楼主 tjj5203 的回复:
程序想实现如下功能:
调用cmd.exe,然后等他运行完后程序才继续执行。

MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
WaitForSingleObject(MyHandle, INFINITE);
//后续的操作

我的代码如上,但是WaitForSingleObject阻塞不了?


貌似这样不行, 换个思路吧,在Timer中不段检测MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe'); 如果MyHandle=0 那么就SetEvent(g_Event);

这里改成
MyHandle:=FindWindow(nil,'C:\windows\system32\cmd.exe');
if MyHandle <> 0 then
Timer.Enable := True;
WaitForSingleObject(g_Event, INFINITE);

1,183

社区成员

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

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