CreateProcess使用

来源:互联网 发布:农村 剩女 心态 知乎 编辑:程序博客网 时间:2024/06/01 12:00
BOOL WINAPI CreateProcess(
  _In_opt_    LPCTSTR               lpApplicationName,
  _Inout_opt_ LPTSTR                lpCommandLine,
  _In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
  _In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_        BOOL                  bInheritHandles,
  _In_        DWORD                 dwCreationFlags,
  _In_opt_    LPVOID                lpEnvironment,
  _In_opt_    LPCTSTR               lpCurrentDirectory,
  _In_        LPSTARTUPINFO         lpStartupInfo,
  _Out_       LPPROCESS_INFORMATION lpProcessInformation
);

主要说明前两个参数的使用方法:
(1)lpApplicationName != NULL。此时lpApplicationName必须包含可执行文件的拓展名,如果文件名带目录则在相应的目录中查找,如果只有一个文件名,则在当前目录中查找。

例如:a.带目录
CreateProcess(_T("D:\\Child.exe"),  
NULL,  
NULL,   
NULL, 
TRUE,
NULL,
NULL,  
NULL,   
&si,  
&pi)

b.不带目录
CreateProcess(_T("Child.exe"),  
NULL,  
NULL,   
NULL, 
TRUE,
NULL,
NULL,  
NULL,   
&si,  
&pi)

(2)lpApplicationName = NULL。
在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开,当CreateProcess解析lpCommandLine 字符串时,它会检查字符串中的第一个标记(token),并假记此标记为我们想运行的可执行文件的名称,如果可执行文件的名称没有扩展名,默认为.exe,并且如果文件名不包含一个完整的路径,CreateProcess还会按以下顺序来搜索可执行文件:
(1)主调进程.exe文件所在的目录
(2)主调进程的当前目录
(3)windows系统目录,即GetSystemDirectory返回的System32子文件夹
(4)windows目录
(5)PATH环境变量中列出的目录

例如:

TCHAR szCmdLine[20] = {0};
_tcscpy_s(szCmdLine,_countof(szCmdLine), _T("Child.exe 123 345 "));

CreateProcess( NULL,  
szCmdLine,  
NULL,   
NULL, 
TRUE,
NULL,
NULL,  
NULL,   
&si,  
&pi)

*注意一个错误调用形式:
CreateProcess( NULL,  
_T("Child.exe 123 345 "),  
NULL,   
NULL, 
TRUE,
NULL,
NULL,  
NULL,   
&si,  
&pi)
错误原因:lpCommandLine的类型为LPTSTR,它期望我们传入的是一个非“常量字符串”的地址。在内部,CreateProcess实际上会修改我们传给他的命令行字符串,当然在它返回前,它会把这个字符串还原。