Windows中CreateProcess()函数的使用说明

 

1.函数原型如下:

BOOL WINAPI CreateProcess(

  __in          LPCTSTR lpApplicationName,//程序的名字及所在目录

  __in_out      LPTSTR lpCommandLine,

  __in          LPSECURITY_ATTRIBUTES lpProcessAttributes,

  __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,

  __in          BOOL bInheritHandles,

  __in          DWORD dwCreationFlags,

  __in          LPVOID lpEnvironment,

  __in          LPCTSTR lpCurrentDirectory,

  __in          LPSTARTUPINFO lpStartupInfo,

  __out         LPPROCESS_INFORMATION lpProcessInformation

);

2.函数说明:

      函数用来运行一个可执行程序,它用来创建一个新的进程和一个主线程,此进程用来执行指定的可执行程序。

      当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1。 该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的D L L文件的代码和数据加载到该进程的地址空间中。 然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。与进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结构。通过执行C / C + +运行期启动代码,该主线程便开始运行,它最终调用WinMain、wWinMain、main或wmain函数。如果系统成功地创建了新进程和主线程,CreateProcess便返回TRUE。

1.lpApplicationNamelpCommandLine

         lpApplicationName和lpCommandLine参数分别用于设定新进程将要使用的可执行文件的名字和传递给新进程的命令行字符串。

lpCommandLine参数的原型是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将不会在任何其他目录中查找该文件,它运行失败了。

2lpProcessAttributes lpThreadAttributesbInheritHandles

      可以使用lpProcessAttributes和pThreadAttributes参数分别设定进程对象和线程对象需要的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。也可以指定两SECURITY_ATTRIBUTES结构,并对它们进行初始化,以便创建自己的安全性权限,并将它们赋予进程对象和线程对象。

将SECURITY_ATTRIBUTES结构用于lpProcessAttributes和pThreadAttributes参数的另一个原因是,父进

程将来生成的任何子进程都可以继承这两个对象句柄中的任何一个。

 dwCreationFlags

     dwCreationFlags参数用于标识标志,以便用于规定如何来创建新进程。

4lpEnvironment

       lpEnvironment,参数用于指向包含新进程将要使用的环境字符串的内存块。在大多数情况下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。也可以使用GetEnvironmentStrings函数。

该函数用于获得调用进程正在使用的环境字符串数据块的地址。可以使用该函数返回的地址,作为CreateProcesspvEnvironment参数。如果为pvEnvironment参数传递NULL,那么这正CreateProcess函数所做的操作。当不再需要该内存块时,应该调用FreeEnvironmentString s函数将内存块释放。

5lpCurrentDirectory

       lpCurrentDirectory参数允许父进程设置子进程的当前驱动器和目录。如果本参数是NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么lpCurrentDirectory,必须指向包含需要的工作驱动器和工作目录的以0结尾的字符串。注意,必须设定路径中的驱动器名。

6lpStartupInfo

       lpsStartInfo参数用于指向一个STARTUPINFO结构。

当Windows创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应

用程序仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将c b成员设置为该

结构的大小。

如果未能将该结构的内容初始化为零,那么该结构的成员将包含调用线程的堆栈上的任何

无用信息。将该无用信息传递给CreateProcess,将意味着有时会创建新进程,有时则不能创建

新进程,完全取决于该无用信息。有一点很重要,那就是将该结构的未用成员设置为零,这样,

CreateProcess就能连贯一致地运行。不这样做是开发人员最常见的错误。

7lpProcessInformation

      lpProcessInformation参数用于指向你必须指定的PROCESS_INFORMATION结构。CreateProcess

返回之前要对该结构的成员进行初始化。

      系统在创建一个新的进程的时侯,系统会建立一个进程内核对象和线程内核对象,内核对象都有一个使用计数,系统会为这个对象赋以一个初始的计数1,在CreateProcess()函数返回之前,这个函数会打开线程对象和进程对象,并将每个对象的与进程相关的句柄放入到结构体PROCESS_INFORMATION中的hProcess和hThread成员中,当CreateProcess在内部打开这些对象的时候,每个对象的使用计数就变为2了,如果我们在父进程当中不需要这两个句柄就可以先将其关闭,系统就会为子进程的进程内核对象和线程内核对象的使用计数减1,当子进程终止运行的时候,系统会再将使用计数减1,至此,子进程的内核对象的使用计数变为0,这两个对象就会被释放掉。

注意:必须关闭子进程和它的主线程的句柄,以避免在应用程序运行时泄漏资源。当然,当进程终止运行时,系统会自动消除这些泄漏现象,但是,当进程不再需要访问子进程和它的线程时,编写得较好的软件能够显式关闭这些句柄(通过调用CloseHandle函数来关闭)。不能关闭这些句柄是开发人员最常犯的错误之一。

由于某些原因,许多开发人员认为,关闭进程或线程的句柄,会促使系统撤消该进程或线程。实际情况并非如此。关闭句柄只是告诉系统,你对进程或线程的统计数据不感兴趣。进程或线程将继续运行,直到它自己终止运行。

当进程内核对象创建后,系统赋予该对象一个独一无二的标识号,系统中的其他任何进程内核对象都不能使用这个相同的I D号。线程内核对象的情况也一样。当一个线程内核对象创建时,该对象被赋予一个独一无二的、系统范围的I D号。进程I D和线程I D共享相同的号码池。

另外参考文章: http://hi.baidu.com/vivo01/blog/item/a2fdc767dcda3b2cab184cb1.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值