一、CreateProcess 函数定义
BOOL CreateProcess
(
LPCTSTR lpApplicationName, //可执行文件的路径
LPTSTR lpCommandLine, //用于指定传递给新进程的命令行参数
LPSECURITY_ATTRIBUTES lpProcessAttributes,//默认NULL
LPSECURITY_ATTRIBUTES lpThreadAttributes, //默认NULL
BOOL bInheritHandles, //默认FALSE
DWORD dwCreationFlags, //设置新进程创建的方式,可使用NORMAL_PRIORITY_CLASS
LPVOID lpEnvironment, //默认NULL
LPCTSTR lpCurrentDirectory, //默认NULL
LPSTARTUPINFO lpStartupInfo, //指向一个STARTUPINFO或STARTUPINFOEX的结构,一般应用程序会仅使用默认值,可以全部置零
LPPROCESS_INFORMATION lpProcessInformation //是一个指向LPPROCESS_INFOMATION结构的指针
);
具体详细的函数介绍可以参考这篇博客:https://blog.csdn.net/baidu_29198395/article/details/82926348
二、CreateProcess()创建返回1的原因
在我的项目里面并没有使用第一个参数的,而是使用null,所以必须使用第二个参数lpCommandLine,这个参数用于指定传递给新进程的命令行参数,由于我们没有使用第一个参数,所以需要把可执行文件名也包含在lpCommandLine内,lpCommandLine格式如下,第一个参数Control_Station_Win 为执行文件名,后面的就是传递给main函数的参数,所以传入参数需要与int main(int ,int )主函数参数对应。
::sprintf(szCmdLine, "Control_Station_Win %s %d", str1,n);
由于我需要创建的进程main函数只有一个参数所以使用下面的格式:
TCHAR szCmdLine[512]{};
::sprintf(szCmdLine, "Control_Station_Win %s ", str);
我出错的原因有两个,
一、szCmdLine没有初始化
二、%s后面没有加空格
因为szCmdLine该参数的类型是LPTSTR,即一个以’0’结尾的char*的C传统字符串,而关键在于:每个参数以空格隔开,所以第二个参数后面需要加一个空格。如下图所示。
通过这次的bug使我对CreateProcess函数有了更深刻的认识。