Delphi 使用CreateProcess建立进程并弹出进程PID值 (转)

var
  ExeName:PChar;
  StartupInfo:TStartupInfo;
  ProcessInfo:TProcessInformation;
begin
  FillChar(ProcessInfo,sizeof(TProcessInformation),0);
  FillChar(StartupInfo,Sizeof(TStartupInfo),0);
  StartupInfo.cb:=Sizeof(TStartupInfo);
  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow:=SW_SHOW;
  ExeName :='C:\Program Files\Internet Explorer\iexplore.exe'; //所建立进程路径
  If CreateProcess(ExeName,nil,nil,nil,False,NORMAL_PRIORITY_CLASS,
    nil,nil,StartupInfo,ProcessInfo) then
  ShowMessage(IntToStr(ProcessInfo.dwProcessId));   //这里就是建立进程的PID值
end;缓存

 

这样就能够执行c:\test.exe
若是你要的PID是进程ID那么这个
piProcInfoGPS.dwProcessId就是PID。安全

当一个线程调用CreateProcess时,系统就会建立一个进程内核对象,其初始使用计数是1。
  该进程内核对象不是进程自己,而是操做系统管理进程时使用的一个较小的数据结构。能够将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。而后,系统为新进程建立一个虚拟地址数据结构

空间,并将可执行文件或任何须要的D L L文件的代码和数据加载到该进程的地址空间中。
  而后,系统为新进程的主线程建立一个线程内核对象(其使用计数为1)。与进程内核对象同样,线程内核对象也是操做系统用来管理线程的小型数据结构。经过执行C / C + +运行期启动代码,该主函数

线程便开始运行,它最终调用WinMain、wWinMain、main或wmain函数。若是系统成功地建立了新进程和主线程,CreateProcess便返回TRUE。
  
  pszApplicationName和pszCommandLine参数分别用于设定新进程将要使用的可执行文件的名字和传递给新进程的命令行字符串
  pszCommandLine参数的原型是PTSTR。这意味着CreateProcess指望你将传递一个很是量字符串的地址。从内部来说,CreateProcess实际上并不修改你传递给它的命令行字符串。不过,在操作系统

CreateProcess返回以前,它将该字符串恢复为它的原始形式。
  若是命令行字符串不包含在文件映象的只读部分中,就会出现违规访问的问题。解决这个问题的最好办法是在调用CreateProcess以前像下面这样将常量字符串拷贝到临时缓存中。当CreateProcess分命令行

析pszCommandLine字符串时,它将查看字符串中的第一个标记,并假设该标记是想运行的可执行文件的名字。若是可执行文件的文件名没有扩展名,便假设它的扩展名为.exe。CreateProcess也按下面线程

的顺序搜索该可执行文件:
  1) 包含调用进程的. e x e文件的目录。
  2) 调用进程的当前目录。
  3) Wi n d o w s的系统目录。
  4) Wi n d o w s目录。
  5) PAT H环境变量中列出的目录。
  若是文件名包含全路径,系统将使用全路径来查看可执行文件,而且再也不搜索这些
  目录。若是系统找到了可执行文件,那么它就建立一个新进程,并将可执行文件的代码和数据
  映射到新进程的地址空间中。而后系统将调用C / C + +运行期启动例程。
  这一切都是在pszApplicationName参数是NULL(99%以上的时候都应该属于这种状况)时
  发生的。若是不传递NULL,能够将地址传递给pszApplicationName参数中包含想运行的可执行
  文件的名字的字符串。请注意,必须设定文件的扩展名,系统将不会自动假设文件名有一
  个.exe扩展名。CreateProcess假设该文件位于当前目录中,除非文件名前面有一个路径。若是在当前目录中找不到该文件,CreateProcess将不会在任何其余目录中查找该文件,它运行失败了。
  
  可使用psaProcess和psaThread参数分别设定进程对象和线程对象须要的安全性。,在这种状况下,系统为这些对象赋予默认安全性描述符。也能够指定两
  个SECURITY_ATTRIBUTES结构,并对它们进行初始化,以便建立本身的安全性权限,并将它们赋予进程对象和线程对象。
  将SECURITY_ATTRIBUTES结构用于psaProcess和psaThread参数的另外一个缘由是,父进
  程未来生成的任何子进程均可以继承这两个对象句柄中的任何一个。
  
  fdwCreate参数用于标识标志,以便用于规定如何来建立新进程。
  
  pvEnvironment参数用于指向包含新进程将要使用的环境字符串的内存块。,使子进程可以继承它的父进程正在使用的一组环境字符串。也能够
  使用GetEnvironmentStrings函数。
  该函数用于得到调用进程正在使用的环境字符串数据块的地址。可使用该函数返回的地
  址,做为CreateProcess的pvEnvironment参数。若是为pvEnvironment参数传递NULL,那么这正
  是CreateProcess函数所作的操做。当再也不须要该内存块时,应该调用FreeEnvironmentString s函数将内存块释放。
  
  
  pszCurDir参数容许父进程设置子进程的当前驱动器和目录。若是本参数是NULL,则新进程的工做目录将与生成新进程的应用程序的目录相同。若是本参数不是NULL,那么pszCurDi r
  必须指向包含须要的工做驱动器和工做目录的以0结尾的字符串。注意,必须设定路径中的驱
  动器名。
  
  
  psiStartInfo参数用于指向一个STARTUPINFO结构。
  当Windows建立新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应
  用程序仅仅使用默认值。  若是未能将该结构的内容初始化为零,那么该结构的成员将包含调用线程的堆栈上的任何
  无用信息。将该无用信息传递给CreateProcess,将意味着有时会建立新进程,有时则不能建立
  新进程,彻底取决于该无用信息。有一点很重要,那就是将该结构的未用成员设置为零,这样,
  CreateProcess就能连贯一致地运行。不这样作是开发人员最多见的错误。
    ppiProcInfo参数用于指向你必须指定的PROCESS_INFORMATION结构。CreateProcess在
  返回以前要对该结构的成员进行初始化。
  在建立进程的时候,系统为每一个对象赋予一个初始使用计数值1。而后,在createProcess返回以前,该函数打开进程对象和线程对象,并将每一个对象的与进程相关的句柄放入PROCESS_INorm

FORMATION结构的hProcess和hThread成员中。当CreateProcess在内部打开这些对象时,每一个对象的使用计数就变为2。
  在系统可以释放进程对象前,该进程必须终止运行(将使用计数递减为1),而且
  父进程必须调用CloseHandle(再将使用计数递减1,使之变为0)。一样,若要释放线程对象,
  该线程必须终止运行,父进程必须关闭线程对象的句柄。
  对象

  当进程内核对象建立后,系统赋予该对象一个独一无二的标识号,系统中的其余任何进程
  内核对象都不能使用这个相同的I D号。线程内核对象的状况也同样。当一个线程内核对象建立
  时,该对象被赋予一个独一无二的、系统范围的I D号。进程I D和线程I D共享相同的号码池。
  这意味着进程和线程不可能拥有相同的I D 。另外,对象决不会被赋予0 做为其I D。在
  CreateProcess返回以前,它要用这些ID填入PROCESS_INFORMATION结构的dwProcessId和dwThre adId成员中。
  应用程序使用I D来跟踪进程和线程,必须懂得系统会当即复用进程I D和线程I D
  系统没法记住每一个进程的父进程的I D,可是,因为I D是被当即重复使用的,所以,等到获
  得父进程的I D时,该I D可能标识了系统中一个彻底不一样的进程。父进程可能已经终止运行。若是应用程序想要与它的“建立者”进行通讯,最好不要使用I D。应该定义一个持久性更
  好的机制,好比内核对象和窗口句柄等。
  若要确保进程I D或线程I D不被重复使用,惟一的方法是保证进程或线程的内核对象不会
  被撤消。继承

相关文章
相关标签/搜索