如何启动一个可执行文件,并得到该可执行文件的句柄以供我的应用程序控制它 (100分)

  • 主题发起人 主题发起人 goodbobi
  • 开始时间 开始时间
G

goodbobi

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在我的程序启动后能运行另外一个应用程序(如:sol.exe)并得到该应用程序(sol.exe)的句柄(因为我要在我的应用程序中通过句柄控制它(sol.exe)).或有其它更好的方法.谢谢!
 
createprocess
 
得到一个程序的句柄到是很容易,但真正要控制一个程序是不简单的,依靠API只是可以控制程序的一些基本的东西,至于全面控制程序我想还是要依靠COM来实现吧,因为它才是真正的进程透明的技术!就象我们使用的很多Office服务器对象一样,那才是真正控制了一个程序的运行呢!
 
TO:Another_eYes<br>&nbsp; 能帮忙写点再具体一点吗?谢谢!<br>TO:晶晶<br>&nbsp; 我目前已经能控制程序了,但是在启动和得到句柄是觉得不是很理想.<br>我的做法是,先启动那个被调用的应用程序,然后再根据被调用窗口的标题得到该窗口的句柄.不知道你有何高见?<br>
 
试一下下面的例子吧:<br>var piProcInfoGPS:PROCESS_INFORMATION;<br>调用:<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp;Timer1.Enabled := True ;<br>&nbsp;EstablishProcess;<br>end;<br>procedure TForm1.EstablishProcess;<br>Var<br>&nbsp; siStartupInfo:STARTUPINFO;<br>&nbsp; saProcess,saThread:SECURITY_ATTRIBUTES;<br>&nbsp; fSuccess:boolean;<br>begin<br>&nbsp; fSuccess:=false;<br>&nbsp; ZeroMemory(@siStartupInfo,sizeof(siStartupInfo));<br>&nbsp; siStartupInfo.cb:=sizeof(siStartupInfo);<br>&nbsp; saProcess.nLength:=sizeof(saProcess);<br>&nbsp; saProcess.lpSecurityDescriptor:=PChar(nil);<br>&nbsp; saProcess.bInheritHandle:=true;<br>&nbsp; saThread.nLength:=sizeof(saThread);<br>&nbsp; saThread.lpSecurityDescriptor:=PChar(nil);<br>&nbsp; saThread.bInheritHandle:=true;<br>&nbsp; fSuccess:=CreateProcess(<br>&nbsp; PChar(nil),PChar(FileListBox1.FileName),@saProcess,@saThread,<br>&nbsp; false,CREATE_DEFAULT_ERROR_MODE,Pchar(nil),<br>&nbsp; Pchar(nil),siStartupInfo,piProcInfoGPS);<br>&nbsp; if( not fSuccess)then<br>&nbsp; &nbsp; Memo1.Lines.Add('Create Process '+FileListBox1.FileName+' fail.')<br>&nbsp; else<br>&nbsp; &nbsp; Memo1.Lines.Add('Create Process '+FileListBox1.FileName+' success.')<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);//监测该程序是否已经退出<br>Var<br>&nbsp; dwExitCode:DWORD;<br>&nbsp; fprocessExit:boolean;<br>Begin<br>&nbsp; dwExitCode:=0;<br>&nbsp; fprocessExit:=false;<br>&nbsp; fprocessExit:=GetExitCodeProcess<br>&nbsp; (piProcInfoGPS.hProcess,dwExitCode);<br>&nbsp; if (fprocessExit and (dwExitCode &lt;&gt; STILL_ACTIVE))then begin<br>&nbsp; &nbsp; Memo1.Lines.Add('['+FileListBox1.FileName+']进程终止');<br>&nbsp; &nbsp; CloseHandle(piProcInfoGPS.hThread);<br>&nbsp; &nbsp; CloseHandle(piProcInfoGPS.hProcess);<br>&nbsp; end;<br>end;
 
to:hongxing_dl<br>我照您这样做只能得到进程的句柄,并没有得到启动主窗口的句柄呀.我如何用Button控制这个窗口的关闭呢.<br>还望赐教
 
你所谓的控制是指什么呢?<br><br>不同的程序,不同的控制方法啊~<br><br>如游戏,你可以控制它的某个数据达到某个效果、普通的窗口程序,你也可以得到handle来控制。。。。
 
只是普通窗口程序,只需要通到handle来控制
 
你的窗体有标题吗? 最简单就是 FindWindow(nil,'标题');
 
有标题,但我不想能过标题得到窗口的句柄,原因是我可能同时打开两个相同的窗口,那幺得到的句柄就有可能不正确了.因为我只想控制我启动的那个窗口.其它的窗口我不要控制它.
 
可以这样终止进程:<br>procedure TForm1.BitBtn1Click(Sender: TObject);<br>Var<br>&nbsp; dwExitCode:DWORD;<br>&nbsp; fprocessExit:boolean;<br>Begin<br>&nbsp; if not timer1.Enabled then<br>&nbsp; &nbsp; timer1.Enabled:=true;<br>&nbsp; dwExitCode:=0;<br>&nbsp; fprocessExit:=false;<br>&nbsp; fprocessExit:=GetExitCodeProcess<br>&nbsp; (piProcInfoGPS.hProcess,dwExitCode);<br>&nbsp; if (not fprocessExit or (dwExitCode = STILL_ACTIVE)) then<br>&nbsp; begin<br>&nbsp; &nbsp; TerminateThread(piProcInfoGPS.hThread,dwExitCode);<br>&nbsp; &nbsp; TerminateProcess(piProcInfoGPS.hProcess,dwExitCode);<br>&nbsp; &nbsp; CloseHandle(piProcInfoGPS.hThread);<br>&nbsp; &nbsp; CloseHandle(piProcInfoGPS.hProcess);<br>&nbsp; end;<br>end;
 
var<br>destHandle:Hwnd; <br>&nbsp; &nbsp;<br>WinExec(Pchar('要启动的程序路径'),SW_HIDE);<br>destHandle:=GetCurrentProcess;<br>Postmessage(desthandle,WM_KEYDOWN,88,0);
 
多人接受答案了。
 

Similar threads

回复
0
查看
748
不得闲
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
后退
顶部