目录
介绍
标志位介绍
代码示例
这些宏定义(dwCreationFlag
值)是用于Windows操作系统中CreateProcess
函数的标志,它们控制新进程的创建方式。下面是这些标志的中文介绍:
介绍
Winbase.h中的部分代码:
//
// Process dwCreationFlag values
//#define DEBUG_PROCESS 0x00000001
#define DEBUG_ONLY_THIS_PROCESS 0x00000002
#define CREATE_SUSPENDED 0x00000004
#define DETACHED_PROCESS 0x00000008#define CREATE_NEW_CONSOLE 0x00000010
#define NORMAL_PRIORITY_CLASS 0x00000020
#define IDLE_PRIORITY_CLASS 0x00000040
#define HIGH_PRIORITY_CLASS 0x00000080#define REALTIME_PRIORITY_CLASS 0x00000100
#define CREATE_NEW_PROCESS_GROUP 0x00000200
#define CREATE_UNICODE_ENVIRONMENT 0x00000400
#define CREATE_SEPARATE_WOW_VDM 0x00000800#define CREATE_SHARED_WOW_VDM 0x00001000
#define CREATE_FORCEDOS 0x00002000
#define BELOW_NORMAL_PRIORITY_CLASS 0x00004000
#define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000#define INHERIT_PARENT_AFFINITY 0x00010000
#define INHERIT_CALLER_PRIORITY 0x00020000 // Deprecated
#define CREATE_PROTECTED_PROCESS 0x00040000
#define EXTENDED_STARTUPINFO_PRESENT 0x00080000#define PROCESS_MODE_BACKGROUND_BEGIN 0x00100000
#define PROCESS_MODE_BACKGROUND_END 0x00200000
#define CREATE_SECURE_PROCESS 0x00400000#define CREATE_BREAKAWAY_FROM_JOB 0x01000000
#define CREATE_PRESERVE_CODE_AUTHZ_LEVEL 0x02000000
#define CREATE_DEFAULT_ERROR_MODE 0x04000000
#define CREATE_NO_WINDOW 0x08000000#define PROFILE_USER 0x10000000
#define PROFILE_KERNEL 0x20000000
#define PROFILE_SERVER 0x40000000
#define CREATE_IGNORE_SYSTEM_DEFAULT 0x80000000
标志位介绍
这些宏定义(dwCreationFlag
值)是用于Windows操作系统中CreateProcess
函数的标志,它们控制新进程的创建方式。下面是这些标志的中文介绍:
-
DEBUG_PROCESS
(0x00000001):指示新进程被创建为调试进程,调用进程成为调试器。 -
DEBUG_ONLY_THIS_PROCESS
(0x00000002):仅调试创建的进程,不调试子进程。 -
CREATE_SUSPENDED
(0x00000004):新进程被创建后初始处于挂起状态,直到ResumeThread
被调用。 -
DETACHED_PROCESS
(0x00000008):新进程没有绑定到父进程的控制台上。
-
CREATE_NEW_CONSOLE
(0x00000010):为新进程创建一个新的控制台窗口。 -
NORMAL_PRIORITY_CLASS
(0x00000020):指定进程具有正常优先级。 -
IDLE_PRIORITY_CLASS
(0x00000040):指定进程的优先级类别为闲置。 -
HIGH_PRIORITY_CLASS
(0x00000080):指定进程的优先级类别为高。
-
REALTIME_PRIORITY_CLASS
(0x00000100):指定进程的优先级类别为实时。 -
CREATE_NEW_PROCESS_GROUP
(0x00000200):新进程是一个新的进程组的头进程。 -
CREATE_UNICODE_ENVIRONMENT
(0x00000400):环境使用Unicode字符集。 -
CREATE_SEPARATE_WOW_VDM
(0x00000800):在独立的虚拟DOS机器(VDM)中运行16位应用程序。
-
CREATE_SHARED_WOW_VDM
(0x00001000):与其他进程共享一个虚拟DOS机器(VDM)。 -
CREATE_FORCEDOS
(0x00002000):强制使用DOS模式。 -
BELOW_NORMAL_PRIORITY_CLASS
(0x00004000):指定进程的优先级类别为低于正常。 -
ABOVE_NORMAL_PRIORITY_CLASS
(0x00008000):指定进程的优先级类别为高于正常。 -
INHERIT_PARENT_AFFINITY
(0x00010000):子进程继承父进程的亲和性。 -
INHERIT_CALLER_PRIORITY
(0x00020000):已弃用。原用于继承调用者的优先级。 -
CREATE_PROTECTED_PROCESS
(0x00040000):创建一个受保护的进程。 -
EXTENDED_STARTUPINFO_PRESENT
(0x00080000):指示传递给CreateProcess
函数的STARTUPINFO
结构是STARTUPINFOEX
结构。
-
PROCESS_MODE_BACKGROUND_BEGIN
(0x00100000):将进程标记为背景模式(低资源使用)开始。 -
PROCESS_MODE_BACKGROUND_END
(0x00200000):将进程标记为背景模式结束。 -
CREATE_SECURE_PROCESS
(0x00400000):创建一个安全进程。
-
CREATE_BREAKAWAY_FROM_JOB
(0x01000000):允许新进程脱离其父进程的作业。 -
CREATE_PRESERVE_CODE_AUTHZ_LEVEL
(0x02000000):保留代码授权级别。 -
CREATE_DEFAULT_ERROR_MODE
(0x04000000):使用系统默认的错误模式,不显示错误消息框。 -
CREATE_NO_WINDOW
(0x08000000):新进程是一个控制台应用程序,不为其创建新窗口。
-
PROFILE_USER
(0x10000000):对用户模式代码进行性能分析。 -
PROFILE_KERNEL
(0x20000000):对内核模式代码进行性能分析。 -
PROFILE_SERVER
(0x40000000):对服务器样本进行性能分析。 -
CREATE_IGNORE_SYSTEM_DEFAULT
(0x80000000):忽略系统默认设置,例如默认的控制台窗口大小等。
这些标志可以组合使用,以实现对新创建进程的精细控制。
代码示例
以下是一个C++示例代码,演示如何使用CreateProcess
函数和上述的一些dwCreationFlags
标志。这个例子尝试创建一个新进程(例如,一个简单的命令行程序cmd.exe
),并使用一些特定的创建标志来演示如何控制进程的创建方式。
#include <windows.h>
#include <iostream>int main() {// 初始化 STARTUPINFO 结构体STARTUPINFO si;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);// 初始化 PROCESS_INFORMATION 结构体PROCESS_INFORMATION pi;ZeroMemory(&pi, sizeof(pi));// 设置创建进程的标志DWORD dwCreationFlags = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;// 创建进程的命令行LPSTR szCmdline = _strdup("cmd.exe");// 创建新进程BOOL bSuccess = CreateProcess(NULL, // 不指定模块名,使用命令行szCmdline, // 命令行NULL, // 默认进程安全属性NULL, // 默认线程安全属性FALSE, // 不继承句柄dwCreationFlags,// 创建标志NULL, // 使用父进程的环境块NULL, // 使用父进程的当前目录&si, // 指向 STARTUPINFO 结构体的指针&pi // 指向 PROCESS_INFORMATION 结构体的指针);if (bSuccess) {std::cout << "Process created successfully.\n";// 等待直到子进程退出WaitForSingleObject(pi.hProcess, INFINITE);// 关闭进程和线程句柄CloseHandle(pi.hProcess);CloseHandle(pi.hThread);} else {std::cerr << "Failed to create process.\n";}// 释放分配的命令行字符串free(szCmdline);return 0;
}
这段代码首先初始化STARTUPINFO
和PROCESS_INFORMATION
结构体,这两个结构体用于CreateProcess
函数的调用。dwCreationFlags
变量设置了进程创建的标志,示例中使用了CREATE_NEW_CONSOLE
(为新进程创建一个新的控制台窗口)和NORMAL_PRIORITY_CLASS
(指定进程具有正常优先级)。接着,它尝试创建一个新的进程(这里是cmd.exe
,Windows的命令行解释器),如果成功,输出成功消息并等待进程结束,最后关闭进程和线程的句柄。
CREATE_NEW_CONSOLE
标志在创建新进程时有一些具体的用途和优点,特别是在涉及到控制台应用程序的上下文中。以下是使用这个标志的一些场景和好处:
隔离控制台输出:当你从一个控制台应用程序中启动另一个控制台应用程序时,使用
CREATE_NEW_CONSOLE
可以为新启动的进程创建一个全新的控制台窗口。这意味着父进程和子进程的控制台输出是隔离的,它们不会相互干扰。这在需要同时查看父进程和子进程的输出时非常有用。用户交互:如果你的应用程序需要与用户交互(例如,通过标准输入读取数据),在新的控制台窗口中运行可以提供更清晰的用户交互界面。用户可以很容易地区分哪些输入和输出属于哪个进程。
调试和日志记录:在开发和调试多进程应用程序时,能够在独立的窗口中看到每个进程的输出可以大大简化调试过程。这样做可以帮助开发者更快地识别问题所在,特别是在处理并发或并行运算时。
提升用户体验:在某些应用场景中,为新启动的任务或服务创建新的控制台窗口可以提供更丰富的用户体验。例如,如果你的应用程序允许用户启动多个后台任务,每个任务在自己的控制台窗口中运行可能会让用户更容易监控每个任务的进度和输出。
避免控制台窗口冲突:在没有使用
CREATE_NEW_CONSOLE
的情况下,如果父进程已经有一个控制台窗口,子进程默认会使用相同的窗口。这可能导致输出混乱,尤其是当多个进程试图同时写入控制台时。通过为每个进程创建新的控制台窗口,可以避免这种冲突。总之,
CREATE_NEW_CONSOLE
标志提供了一种灵活的方式来管理多进程应用程序中的控制台输出和用户交互,有助于提高应用程序的可用性和调试的便利性。
请注意,实际使用时,你可能需要根据具体需求调整命令行字符串和创建标志。