我用的是ShellExecute,exe程序中有return值,但是怎么得到?还有,调用是两个线程一起跑,我怎么才知道exe已经运行结束了?请指教,多谢!
解决方案 »
- delphi 有没有 like 比较运算符,没有如何实现 like 功能??
- 一个资源文件问题,怎么老是出错
- richedit右键菜单
- 请看帖子http://expert.csdn.net/Expert/topic/2696/2696160.xml?temp=.3554041
- 谁有XP控件?我用的XP控件都不能达到真正的XP下的效果!
- 有支持delphi6的图形包TeeChart6吗?急!
- 有谁用DELPHI开发过ACTIVEX控件
- 急:如何单独的取得dbGrid表格里的每一项数据
- 请高手出招:用Query1查询ACCESS数据库出问题??
- 怪,怪,怪:我的DELPHI5的主菜单不见了!
- 请教南京的同胞们!!!
- 如何把一个自定义对象保存到文件然后再从文件装载该对象?
function RunExeFile(const Prog, CommandLine, Dir: string; var ExitCode: DWORD):
string; procedure CheckResult(b: Boolean);
begin
if not b then
raise Exception.Create(SysErrorMessage(GetLastError));
end;
var
HRead, HWrite : THandle;
StartInfo : TStartupInfo;
ProceInfo : TProcessInformation;
b : Boolean;
sa : TSecurityAttributes;
begin
Result := '';
FillChar(sa, sizeof(sa), 0);
//设置允许继承,否则在NT和2000下无法取得输出结果
sa.nLength := sizeof(sa);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := nil;
b := CreatePipe(HRead, HWrite, @sa, 0);
CheckResult(b); FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);
StartInfo.wShowWindow := SW_SHOW;
//使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式
StartInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
StartInfo.hStdError := HWrite;
StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); //HRead;
StartInfo.hStdOutput := HWrite; b := CreateProcess(PChar(Prog), //lpApplicationName: PChar
PChar(CommandLine), //lpCommandLine: PChar
nil, //lpProcessAttributes: PSecurityAttributes
nil, //lpThreadAttributes: PSecurityAttributes
True, //bInheritHandles: BOOL
CREATE_NEW_CONSOLE,
nil,
PChar(Dir),
StartInfo,
ProceInfo); CheckResult(b);
WaitForSingleObject(ProceInfo.hProcess, INFINITE);
GetExitCodeProcess(ProceInfo.hProcess, ExitCode);
end;
Function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;
var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=visiable;
if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then
result:=0
else
begin
waitforsingleobject(processinfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;