又是CreateProcess的问题,尊敬的CJ and Pipi.请请请进.(100分)

  • 主题发起人 主题发起人 MaoSheng lee
  • 开始时间 开始时间
M

MaoSheng lee

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
pInfomation:TProcessInformation;
sStartupInfo:TStartupInfo;
begin

sStartupInfo.cb := SizeOf(sStartupInfo);
sStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
sStartupInfo.wShowWindow := SW_hide;
if not CreateProcess('d:/bkdata/bkdata.bat',nil,nil,nil,
false,0,nil,nil,sStartupInfo,pInfomation) then

Application.MessageBox('Error Run!','Warning',mb_ok+MB_ICONINFORMATION)
else

WaitForSingleObject(pInfomation.hProcess,infinite);
//用CreateProcess的最主要目的
edit1.text:='Finish Run!';
end;

//假设 bkdata.bat 文件: @ copy backup.zip test.zip (backup.zip > 50M btys),仅仅是假设的外部程序.
问题是: 当sStartupInfo.wShowWindow := SW_show;时会出现一个讨厌的dos窗口.不喜欢!
当sStartupInfo.wShowWindow := SW_hide;时象上面,当外部程序执行完之后,程序就无法往下运行,当然
也无法运行GetExitCodeProcess,当按Ctrl+Alt+Del时会发现有WinoldApp,当把bkdata.bat转换成
bkdata.pif(设退出时关闭)就没问题.但是我是在程序中产生的BAT,我又不会在程序中做PIF,
简单地说问题是: 怎样才能有效关闭执行完之后的外部程序?
顺便问一下: 有谁知道MTX_.EXE是什么东西?
 
试试:
CreateProcess('command.com /c d:/bkdata/bkdata.bat', ......);
// 95/98
CreateProcess('cmd.exe /c d:/bkdata/bkdata.bat', ....);
// NT
 
测试基本通过,Another_eYes兄的第三只眼果然厉害!有点遗憾的会出现黑屏幕.
 
其实如果不需要同时运行多个bat, 那么动态创建的bat文件同名也应该没有关系的呀.

比如, 创建的批处理文件就叫 a.bat, 同一目录下有一个事先建立好的文件, 叫
a.pif, 用以运行a.bat的, 那么以后每次只要构造不同的a.bat就可以了.
 
我在NT下使用,不会出现黑屏幕:

1.设置sStartupInfo.wShowWindow := SW_hide;
2.CreateProcess(nil,'cmd.exe /c ....',.......)
(注意应该把'cmd.exe /c ....'作为第二个参数--命令行)
 
sorry,粘贴问题的时候,少了一句:"FillChar(sStartupInfo,Sizeof(sStartupInfo),#0);"
应该放在"sStartupInfo.cb := SizeOf(sStartupInfo);"之前,"begin
"之后.要不就不能完全
运行.
在'瘟酒吧'里按Another_eYes所讲,用户界面不太友好,按Iknow所讲,要预先做好一个PIF,
有点难受.至于NT暂时没法试.
难道真的没办法了?

(贴了两天才把它贴上,现在上网越来越慢了,经常二十多分钟才能上到网,经常按"下一
页"要好几分钟才出来,在"联众四国游戏厅"里显示的网速是一般是50左右,离线率17%,
好在不是自已...要不真的要吐血了).
 
看来还是大虾受人尊敬。
 
非也,是乐于助人的人,可敬!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部