关于CreateProcess和ExitProcess的使用问题(100分)

  • 主题发起人 主题发起人 Lucky
  • 开始时间 开始时间
L

Lucky

Unregistered / Unconfirmed
GUEST, unregistred user!
CreateProcess和ExitProcess的参数弄不通,哪位大虾有实例请不吝赐教。
 
CreatProcess <br>声明 <br>&nbsp; BOOL CreateProcess(<br>&nbsp; &nbsp; LPCTSTR &nbsp;lpApplicationName, // 要执行的应用程序的名字。<br>&nbsp; &nbsp; LPTSTR &nbsp;lpCommandLine, // 要执行的命令行<br>&nbsp; &nbsp; LPSECURITY_ATTRIBUTES &nbsp;lpProcessAttributes, // pointer to process security attributes <br>&nbsp; &nbsp; LPSECURITY_ATTRIBUTES &nbsp;lpThreadAttributes, // pointer to thread security attributes <br>&nbsp; &nbsp; BOOL &nbsp;bInheritHandles, // handle inheritance flag <br>&nbsp; &nbsp; DWORD &nbsp;dwCreationFlags, // creation flags <br>&nbsp; &nbsp; LPVOID &nbsp;lpEnvironment, // pointer to new environment block <br>&nbsp; &nbsp; LPCTSTR &nbsp;lpCurrentDirectory, // pointer to current directory name <br>&nbsp; &nbsp; LPSTARTUPINFO &nbsp;lpStartupInfo, // pointer to STARTUPINFO <br>&nbsp; &nbsp; LPPROCESS_INFORMATION &nbsp;lpProcessInformation // pointer to PROCESS_INFORMATION &nbsp;<br>&nbsp; &nbsp;);<br>&nbsp;<br>说明 <br>&nbsp; 创建一个新进程 <br>返回值 <br>&nbsp; Long,非零表示成功,零表示失败。<br>&nbsp; 会设置GetLastError <br>参数表 <br>参数 类型及说明 <br>&nbsp; lpApplicationName String,要执行的应用程序的名字。可设为vbNullString;<br>&nbsp; &nbsp; 在这种情况下,应用程序的名字应在lpCommandLine参数的起始处出现<br>&nbsp; lpCommandLine String,要执行的命令行。可用GetCommandLine函数取得一个进程使用的命令行。<br>&nbsp; &nbsp; windows会尽可能地根据下述搜索顺序来查找执行文件: <br>(1)包含了父进程执行文件的目录 <br>(2)父进程当前的目录 <br>(3)由GetSystemDirectory返回的系统目录 <br>(4)仅适于windows NT:16位系统目录 <br>(5)由GetSystemDirectory返回的windows目录 <br>(6)由PATH环境变量指定的目录 <br>&nbsp; lpProcessAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,<br>&nbsp; &nbsp; &nbsp;或传递零值表示采用不允许继承的默认描述符。该参数定义进程的安全特性 <br>&nbsp; lpThreadAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,<br>&nbsp; &nbsp; &nbsp;或传递零值表示采用不允许继承的默认描述符。该参数定义进程之主进程的安全特性 <br>&nbsp; bInheritHandles Long,TRUE表示允许当前进程中的所有句柄都由新建的子进程继承 <br>&nbsp; dwCreationFlags Long,来自API32.TXT文件的一个或多个下述常数之一,<br>&nbsp; &nbsp; &nbsp;它们都带有前缀CREATE_。下面这些用于VB程序员: <br>&nbsp; CREATE_SEPARATE_WOW_VDM(仅适用于NT):启动一个16位的windows应用程序时,<br>&nbsp; &nbsp; &nbsp;强迫它在自己的内存空间运行 &nbsp;<br>&nbsp; CREATE_SHARED_WOW_VDM(仅适用于NT):启动一个16位的windows应用程序时,<br>&nbsp; &nbsp; &nbsp;强迫它在共享的16位虚拟机内运行 <br>&nbsp; CREATE_SUSPENDED:立即挂起新进程。除非调用ResumeThread函数。 <br>&nbsp; IDLE_PRIORITY_CLASS:新进程应该有非常低的优先级,<br>&nbsp; &nbsp; &nbsp;只有在系统空闲的时候才能运行。基本值是4 <br>&nbsp; HIGH_PRIORITY_CLASS:新进程应该有非常高的优先级,基本值是13 <br>&nbsp; NORMAL_PRIORITY_CLASS:标准优先级。如进程位于前台,则基本值是9;<br>&nbsp; &nbsp; &nbsp;如在后台。则优先值是7 <br>&nbsp; lpEnvironment 任何类型,指向一个环境块的指针 <br>&nbsp; lpCurrentDriectory String,新进程的当前目录路径 <br>&nbsp; lpStartupInfo STARTUPINFO,指定一个STARTUPINFO结构,<br>&nbsp; &nbsp; &nbsp;其中包含了创建进程时使用的附加信息 <br>&nbsp; lpProcessInformation PROCESS_INFORMATION,该结构用于容纳新进程的进程和线程标识。<br>&nbsp; &nbsp; &nbsp;大多数情况下,一旦这个函数返回,父应用程序都会关闭两个句柄。 <br><br><br>ExitProcess <br>说明<br>&nbsp; ExitProcess 函数 结束一个进程和所有进程打开的线程<br>声明 <br>&nbsp; VOID ExitProcess(<br>&nbsp; &nbsp; UINT &nbsp;uExitCode // exit code for all threads &nbsp;<br>&nbsp; &nbsp;);<br>&nbsp;<br>说明 <br>&nbsp; 中止一个进程 <br>&nbsp; 在Delphi中使用 ,应尽量避免用该函数来关闭进程。<br>&nbsp; 不要在自己的程序中使用它。此时,<br>&nbsp; 应试着向要关闭的那个程序的主窗口投递一条WM_CLOSE消息 <br>参数表 <br>参数 类型及说明 <br>uExitCode Long,指定想中断的那个程序的一个退出代码 <br><br>希望共同探讨。
 
hsw 您好!<br>感谢您提供的信息。由于我对Windows API使用较少,有些问题还搞不清楚。我测试<br>CreateProcess 的结果是它拒不执行。是否使用Windows NT有特殊要求?不知您是<br>否有使用该函数的实例能让我拜读一下?<br>此外我更感兴趣的是您提到的中止一个进程向要关闭的那个程序的主窗口投递一条<br>WM_CLOSE消息的方法。能否给我解释的更具体一点? 谢谢!<br>&nbsp;
 
老问题中有实例,你可以检索一把。
 
procedure TForm1.Button1Click(Sender: TObject);<br>var<br>st:TStartUpInfo;<br>pp:TProcessInformation;<br>ppp:Thandle;<br>tt:Cardinal;<br>begin<br>FillChar(st,sizeof(st),#0);<br>with st do<br>begin<br>&nbsp; cb:=sizeof(st);<br>&nbsp; dwFlags:=StartF_UsesTDHandles or STARTF_USESHOWWINDOW;<br>&nbsp; lptitle:=nil;<br>&nbsp; wShowWindow:=SW_HIDE;<br>end;<br>CreateProcess(PChar('c:/program files/microsoft office/office/winword.exe'),<br>&nbsp; &nbsp; &nbsp; nil,nil,nil,true,DETACHED_PROCESS,nil,nil,st,pp);<br>&nbsp; ppp:=OpenProcess(PROCESS_ALL_ACCESS, FALSE,pp.dwProcessId );<br>&nbsp; GetExitCodeProcess(ppp,tt);<br>&nbsp; Exitprocess(tt)<br><br>// &nbsp;TerminateProcess(ppp,0);也可代替GetExitCodeProcess与ExitProcess<br>end;<br>
 
Liu JZX 您好!<br>&nbsp; &nbsp;您的实例我稍加改动现以通过测试,非常感谢!有一点问题我搞不懂:<br>在您的例子中使用 TerminateProcess(ppp,0) 可以结束一个新创建的进程,<br>而使用 GetExitCodeProcess(ppp,tt) 和 Exitprocess(tt) 却只结束了<br>应用程序本身。 Why?
 
多人接受答案了。
 
后退
顶部