VC创建进程CreateProcess的方法需要以下几步:
1. 引用头文件和命名空间
在使用CreateProcess方法前需要在工程中引入Windows.h头文件,并在代码中调用Windows命名空间。
#include <Windows.h>
using namespace std;
2. 定义参数和启动信息
我们需要定义以下几个参数:
- lpApplicationName:要启动的应用程序名称或者NULL,如果指定了路径,还可以带参数
- lpCommandLine:命令行参数,如果存在需要传入应用程序的命令行参数
- lpProcessAttributes:进程的安全属性,通常为NULL
- lpThreadAttributes:线程的安全属性,通常为NULL
- lpStartupInfo:启动信息,包括控制台窗口的大小、标题、窗口位置、显示模式等等
- lpProcessInformation:过程的信息,包括进程的句柄、进程的ID和主线程的句柄
代码示例:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
3. 启动进程
使用CreateProcess函数创建新的进程,此函数将启动新的进程,并将其连接到指定的进程和主线程。
代码示例:
BOOL bResult = CreateProcess(lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
FALSE,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
&si,
&pi);
可以看到,在函数调用时,需要传入多个参数,下面将对其中的参数进行详细解释。
- lpApplicationName
指定要启动的应用程序名称或路径,或设置为NULL。
- lpCommandLine
命令行参数,如果存在需要传入应用程序的命令行参数。例如: "C:\Windows\system32\cmd.exe /c dir /s"
- lpProcessAttributes
决定了诸如进程的安全性、进程对象上的访问权限以及进程对象的名字的属性。
- lpThreadAttributes
决定了线程的安全性、线程对象上的访问权限以及线程对象的名字的属性。
- lpEnvironment
指向环境变量块的指针,如果设置为NULL,则使用当前进程环境块。
- lpCurrentDirectory
指定启动目录,如果设置为NULL,则使用当前进程的目录。
- dwCreationFlags
指定进程的创建标志,例如 CREATE_NEW_CONSOLE 创建新的控制台窗口。
如果函数调用成功,返回值为非零,反之返回值为0,我们可以通过GetLastError函数来获取错误信息。
示例1
如果我们要启动一个exe程序并传入参数,则可以这样写代码:
LPCTSTR lpApplicationName = NULL;
LPTSTR lpCommandLine = _tcsdup(TEXT("test.exe param1 param2"));
LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL;
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
BOOL bInheritHandles = FALSE;
DWORD dwCreationFlags = 0;
LPVOID lpEnvironment = NULL;
LPCTSTR lpCurrentDirectory = NULL;
LPSTARTUPINFO lpStartupInfo = new STARTUPINFO();
LPPROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION();
ZeroMemory(lpStartupInfo, sizeof(STARTUPINFO));
lpStartupInfo->cb = sizeof(lpStartupInfo);
BOOL bResult = CreateProcess(lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation);
if (!bResult) {
printf("Error: %d\n", GetLastError());
}
else {
printf("Process started. Process id:%d thread id:%d\n",
lpProcessInformation->dwProcessId,
lpProcessInformation->dwThreadId);
}
delete lpStartupInfo;
delete lpProcessInformation;
free(lpCommandLine);
示例2
如果我们要启动一个控制台程序,并且需要在新的控制台窗口中输出信息,则可以这样写代码:
LPCTSTR lpApplicationName = _T("cmd.exe");
LPTSTR lpCommandLine = _tcsdup(TEXT("/C echo hello world"));
LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL;
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
BOOL bInheritHandles = FALSE;
DWORD dwCreationFlags = CREATE_NEW_CONSOLE;
LPVOID lpEnvironment = NULL;
LPCTSTR lpCurrentDirectory = NULL;
LPSTARTUPINFO lpStartupInfo = new STARTUPINFO();
LPPROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION();
ZeroMemory(lpStartupInfo, sizeof(STARTUPINFO));
lpStartupInfo->cb = sizeof(lpStartupInfo);
BOOL bResult = CreateProcess(lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation);
if (!bResult) {
printf("Error: %d\n", GetLastError());
}
else {
printf("Process started. Process id:%d thread id:%d\n",
lpProcessInformation->dwProcessId,
lpProcessInformation->dwThreadId);
}
delete lpStartupInfo;
delete lpProcessInformation;
free(lpCommandLine);
以上就是关于VC创建进程CreateProcess的方法的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VC创建进程CreateProcess的方法 - Python技术站