CreateProcess

[cpp]  view plain  copy
  1. CreateProcess  
  2. BOOL CreateProcess(  
  3.   LPCTSTR lpApplicationName,                 // name of executable module  
  4.   LPTSTR lpCommandLine,                      // command line string  
  5.   LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD  
  6.   LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD  
  7.   BOOL bInheritHandles,                      // handle inheritance option  
  8.   DWORD dwCreationFlags,                     // creation flags  
  9.   LPVOID lpEnvironment,                      // new environment block  
  10.   LPCTSTR lpCurrentDirectory,                // current directory name  
  11.   LPSTARTUPINFO lpStartupInfo,               // startup information  
  12.   LPPROCESS_INFORMATION lpProcessInformation // process information);  

当CreateProcess被一个线程调用时,系统会创建一个进程内核对象,进程内核对象并不代表进程本身,它是操作系统,用来管理这个进程的数据结构,该结构当中有一个使用计数,会在进程被创建是设置为1,然后系统为新进程创建一个虚拟地址空间,将所需的代码以及数据加载到进程的地址空间当中,之后,系统会为新进程的主线程创建一个线程内核对象,主线程最终会调用你的main函数
如果系统成功创建了新进程和主线程,函数会返回ture


pszApplicationName
制定新进程要使用的执行体文件的名称
当在pszApplicationName中传一个文件路径时,如果给的是一个相对路径,那么他只会在当前目录下进行查找,当这个值不为null时,pszCommandLine会被当为命令行参数传递
如果不加后缀名 默认是exe


执行体文件  是 exe文件


pszCommandLine
传递新进程的命令行字符串
如果pszApplicationName为NULL,我们可以在pszCommandLine中传一个文件的路径,如果我们传的是一个相对路径,他会按照一下顺序来搜索:
1 所在目录
2 当前目录
3 windows系统目录(system32mul)
4 windows目录
5 path环境变量中列出的目录


pszCommandLine参数还有一个需要注意的地方,CreateProcess内部会修改这个参数,所以我们不应该传递一个常量指针




psaProcess
设置进程内核对象的安全属性    null
psaThread
设置主线程内核对象的安全属性   null
blnheritHandles    false
是否被继承


fdwCreate       标志位      用的最多的 是 下面的 这个标志位
进程创建方式标志  
CREATE_NO_WINDOWS
标志指示系统不要为应用程序创建任何控制台窗口,可以用这个标志来执行没有用户界面的控制台程序


pvEnvironment
pvEnvironment参数指向一个内存块,其中包含了新进程要使用的环境字符串。大多数时候,为了这个参数传入的值都是null,这讲导致子进程继承其父进程使用的一组环境字符串。另外,还可以使用GetEnvironmentStrings函数






psiStartInfo

此结构体一点要清零,否则成员间包含主线程堆栈上的垃圾数据

[cpp]  view plain  copy
  1. typedef struct _STARTUPINFO {   
  2.     DWORD   cb;   //初始化为sizeof(STARTUPINFO)  版本控制  
  3.     LPTSTR  lpReserved; //保留 必须初始化为null  
  4.     LPTSTR  lpDesktop; //启动应用程序的桌面名称   windows 有很多桌面切换  
  5.     LPTSTR  lpTitle; //控制台下可用,制定控制台的窗口标题  
  6.     DWORD   dwX; //屏幕的位置  
  7.     DWORD   dwY; //屏幕的位置  
  8.     DWORD   dwXSize; //屏幕的宽度  
  9.     DWORD   dwYSize; //屏幕的高度  
  10.     DWORD   dwXCountChars; //控制台下可用,控制台的宽度  
  11.     DWORD   dwYCountChars; //控制台下可用,控制台的高度  
  12.     DWORD   dwFillAttribute; //控制台下可用,控制台的文本和背景色  
  13.     DWORD   dwFlags; //组合值  
  14.     WORD    wShowWindow; //窗口可用,窗口如何显示  
  15.     WORD    cbReserved2; //保留  
  16.     LPBYTE  lpReserved2; //保留  
  17.     HANDLE  hStdInput; //设置标准输入  
  18.     HANDLE  hStdOutput; //设置标准输出  
  19.     HANDLE  hStdError; //设置标准错误输出  
  20. } STARTUPINFO, *LPSTARTUPINFO;   

dwFlags


STARTF_FORCEONFEEDBACK  不改变鼠标光标


STARTF_FORCEOFFFEEDBACK 改变鼠标为等待


STARTF_PREVENTPINNING 窗口无法被固定在任务栏上


STARTF_RUNFULLSCREEN 是x86计算机上运行的一个控制台应用程序已经全屏模式启动


STARTF_TITLEISAPPID 设置任务栏和开始菜单的状态


STARTF_TITLEISLINKNAME


STARTF_UNTRUSTEDSOURCE


STARTF_USECOUNTCHARS 使用dwXConstChars和...


STARTF_USEFILLATTRIBUTE 使用dwFillAttribute


STARTF_USEHOTKEY


STARTF_USEPOSITION 使用 dwX and  dwY成员


STARTF_USESHOWWINDOW  使用wShowWindow成员


STARTF_USESIZE  使用dwXSize和dwYSize
STARTF_USESTDHANDLES 使用 hStdlnput ,hStdOutput  和hshdError


[cpp]  view plain  copy
  1. typedef struct _PROCESS_INFORMATION {   
  2.     HANDLE hProcess;  //启动的进程句柄  
  3.     HANDLE hThread;     //启动的线程句柄  
  4.     DWORD dwProcessId;  //PID  
  5.     DWORD dwThreadId;  //TID  
  6. } PROCESS_INFORMATION;   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值