抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

CreateProcess

创建一个新进程及主线程。新进程在调用进程的安全上下文中运行;

函数声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
WINBASEAPI
BOOL
WINAPI
CreateProcessA(
_In_opt_ LPCSTR lpApplicationName,
_Inout_opt_ LPSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOA lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);

WINBASEAPI
BOOL
WINAPI
CreateProcessW(
_In_opt_ LPCWSTR lpApplicationName,
_Inout_opt_ LPWSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCWSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOW lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);

#ifdef UNICODE
#define CreateProcess CreateProcessW
#else
#define CreateProcess CreateProcessA
#endif // !UNICODE

参数

lpApplicationName

要执行的模块的名称。lpApplicationName参数可以是NULL, 要运行批处理文件, 必须启动命令解释程序, 并将lpApplicationName设置成cmd.exe;

lpCommandLine

要执行的命令行。lpCommandLine的参数可以是NULL, 在这种情况下, 该函数使用由lpApplicationName指向的字符串作为命令行。如果lpApplicationNamelpCommandLine都不为NULL, 则由lpApplicationName指向的以空字符串结尾的字符串会指定要执行的模块, 并且由lpCommandLine指向的以空字符串结尾的字符串会指定命令行;

lpProcessAttributes

指向SECURITY_ATTRIBUTES结构的指针, 用于确定是否可以由子进程继承返回新进程对象的句柄。如果lpProcessAttributesNULL, 则不能继承句柄;

lpThreadAttributes

指向SECURITY_ATTRIBUTES结构的指针, 用于确定是否可以由子进程继承返回的新线程对象的句柄。如果lpThreadAttributesNULL, 则不能继承句柄;

bInheritHandles

如果此参数为TRUE, 则调用进程中的每个可继承句柄都将由新进程来继承。如果该参数为FALSE, 则不会继承句柄;

dwCreationFlags

控制优先级和创建进程的标志。例如, CREATE_NEW_CONSOLE表示新进程将使用一个新控制台, 而不是继承父进程的控制台。CREATE_SUSPENDED表示新进程的主线程会以暂停的状态来创建, 直到调用ResumeThread函数时才运行;

lpEnvironment

指向新进程的环境块的指针。如果此参数为NULL, 则新进程将使用调用进程的环境;

lpCurrentDirectory

指向进程当前目录的完整路径。该字符串还可以指定UNC路径, 如果此参数为NULL, 则新进程将具有与调用进程相同的当前驱动器和目录;

lpStartupInfo

指向STARTUPINFOSTARTUPINFOEX结构的指针。STARTUPINFOSTARTUPINFOEX中的句柄在不需要时必须由CloseHandle关闭;

lpProcessInformation

指向PROCESS_INFOMATION结构的指针。用于接收有关新进程的标识信息。PROCESS_INFOMATION中的句柄必须在不需要时由CloseHandle关闭;

返回值

如果函数成功, 则返回值非零;
如果函数失败, 则返回值为零;

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
STARTUPINFO si = { 0 };
PROCESS_INFOMATION pi = { 0 };
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效
si.wShowWindow = uiCmdShow;
BOOL bRet = CreateProcess(NULL, "cmd.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (bRet == FALSE)
{
CloseHandle(pi.hThread);
CloseHanle(pi.hProcess);
return;
}

使用事项-1

CreateProcess着重注意5个参数: 执行模块名称的参数lpApplicationName、执行命令行的参数lpCommandLine、控制进程优先级和创建进程标志的参数dwCreationFlags、指向STARTUPINFO信息结构的参数lpStartupInfo、以及指向PROCESS_INFOMATION信息结构的参数lpProcessInformation;

使用事项-2

CreateProcess函数在指定窗口显示方式时, 需要在STARTUPINFO结构体中将启用标志设置成STARTF_USESHOWWINDOW, 表示wShowWindow成员显示方式有效。然后将wShowWindow设置为SW_HIDE隐藏窗口, 创建方式为CREATE_NEW_CONSOLE创建一个新控制台;

评论