Windowc++创建⼦进程
在window系统中,创建⼀个⼦进程可以使⽤CreateProcessA⽅法实现,其函数API如下:
BOOL CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
createprocessa);
主要参数如下:
lpApplicationName
是可执⾏⽂件的名称,该名称可以是带完整路径;也可以是只有名称,这种情况下只能在当前路径下查。需要注意的是,⽂件名⼀定要有后缀.exe。
例如:E:\code\c++\myproject\vs2008\或者是
当然该参数我们也可以设置为NULL,可以执⾏程序由lpCommandLine参数决定。
lpCommandLine
当lpApplicationName 设置为NULL时,可执⾏程序⽂件名由lpCommandLine中的第⼀空格作为界定符。空格后⾯才是执⾏参数。
在lpCommandLine中设置可执⾏程序,有以下⼏个好处:
1. 对于系统命令,可以不写命令路径和后缀.exe,此时系统默认是exe后缀。
2. 不写路径的情况,它可以去指定路径下搜索,包括path路径,windows⽬录等。
bInheritHandles
指定⼦进程是否能继承⽗进程的对象句柄
lpStartupInfo
设置⼦进程启动信息,⼀般⽤设置⼦进程窗⼝如何显⽰。
lpProcessInformation
返回⼦进程的进程句柄和⼦进程对应的主线程句柄
总结:
为了⽅便,我们⼀般设置lpApplicationName为NULL,可执⾏⽂件名由lpCommandLine决定;使⽤默认属性我们可以设置参数为NULL.
1. lpCommandLine参数格式:exe + 空格 + 参数
2. 对于⾮系统命令,exe要是完整路径,如果是系统命令可直接是命令名称
3. 对于⽆输⼊参数,则lpCommandLine是命令名称或者带路径的exe即可。
该函数的简单使⽤如下:
#include<windows.h>
#include<stdio.h>
#include<tchar.h>
void_tmain(int argc, TCHAR *argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(si));
si.cb =sizeof(si);
ZeroMemory(&pi,sizeof(pi));
if( argc !=2)
{
printf("Usage: %s [cmdline]\n", argv[0]);
return;
}
// Start the child process.
if(!CreateProcess(NULL,// No module name (use command line)
argv[1],// Command line
NULL,// Process handle not inheritable
NULL,// Thread handle not inheritable
FALSE,// Set handle inheritance to FALSE
0,// No creation flags
NULL,// Use parent's environment block
NULL,// Use parent's starting directory
&si,// Pointer to STARTUPINFO structure
&pi )// Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n",GetLastError());
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
为了⽅便使⽤和代码复⽤,我实现了⼀个CWorkProcess进程管理类,类设计如下:
class CWorkProcess
{
public:
//CWorkProcess subProcess("ping","192.168.0.1");
//CWorkProcess subProcess("ping",NULL);
//CWorkProcess subProcess("E:\\code\\c++\\project\\,NULL", "10");
CWorkProcess(char* szApp,char* arg);
~CWorkProcess();
//启动进程
bool LaunchProcess();
//进程检查
bool CheckIfProcessIsActive();
//结束进程
bool StopProcess();
//进程等待
bool Wait(int nTimeout);
private:
PROCESS_INFORMATION m_pi;
char* m_pszCmd;
};
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论