Windows C++:控制新进程的创建方式

        

目录

介绍

标志位介绍 

代码示例


        这些宏定义(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;
}

        这段代码首先初始化STARTUPINFOPROCESS_INFORMATION结构体,这两个结构体用于CreateProcess函数的调用。dwCreationFlags变量设置了进程创建的标志,示例中使用了CREATE_NEW_CONSOLE(为新进程创建一个新的控制台窗口)和NORMAL_PRIORITY_CLASS(指定进程具有正常优先级)。接着,它尝试创建一个新的进程(这里是cmd.exe,Windows的命令行解释器),如果成功,输出成功消息并等待进程结束,最后关闭进程和线程的句柄。

CREATE_NEW_CONSOLE标志在创建新进程时有一些具体的用途和优点,特别是在涉及到控制台应用程序的上下文中。以下是使用这个标志的一些场景和好处:

  1. 隔离控制台输出:当你从一个控制台应用程序中启动另一个控制台应用程序时,使用CREATE_NEW_CONSOLE可以为新启动的进程创建一个全新的控制台窗口。这意味着父进程和子进程的控制台输出是隔离的,它们不会相互干扰。这在需要同时查看父进程和子进程的输出时非常有用。

  2. 用户交互:如果你的应用程序需要与用户交互(例如,通过标准输入读取数据),在新的控制台窗口中运行可以提供更清晰的用户交互界面。用户可以很容易地区分哪些输入和输出属于哪个进程。

  3. 调试和日志记录:在开发和调试多进程应用程序时,能够在独立的窗口中看到每个进程的输出可以大大简化调试过程。这样做可以帮助开发者更快地识别问题所在,特别是在处理并发或并行运算时。

  4. 提升用户体验:在某些应用场景中,为新启动的任务或服务创建新的控制台窗口可以提供更丰富的用户体验。例如,如果你的应用程序允许用户启动多个后台任务,每个任务在自己的控制台窗口中运行可能会让用户更容易监控每个任务的进度和输出。

  5. 避免控制台窗口冲突:在没有使用CREATE_NEW_CONSOLE的情况下,如果父进程已经有一个控制台窗口,子进程默认会使用相同的窗口。这可能导致输出混乱,尤其是当多个进程试图同时写入控制台时。通过为每个进程创建新的控制台窗口,可以避免这种冲突。

总之,CREATE_NEW_CONSOLE标志提供了一种灵活的方式来管理多进程应用程序中的控制台输出和用户交互,有助于提高应用程序的可用性和调试的便利性。

        请注意,实际使用时,你可能需要根据具体需求调整命令行字符串和创建标志。

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea中引入新JDK环境

在不同的项目中往往会需要不同的运行环境&#xff0c;那么如何下载一个新的环境并运用到idea中呢&#xff1f; 下面给出的就是oracle官网&#xff0c;以JDK17为例教大家如何下载 Java Archive Downloads - GraalVM for JDK 17https://www.oracle.com/java/technologies/javase…

Python数据可视化库之bashplotlib使用详解

概要 在数据可视化领域,Python拥有许多优秀的库,如Matplotlib、Seaborn等,它们可以创建漂亮而复杂的图形。但是,有时候我们可能需要在终端中绘制简单的图形,这时候Bashplotlib就派上了用场。Bashplotlib是一个Python库,可以在终端中绘制基本的图形,如条形图、散点图等。…

YOLOV9训练集制作+Train+Val记录

一、YOLO数据集格式分布 在YOLO中&#xff0c;数据集的分布如图&#xff0c;在dataset文件夹下有imags&#xff08;图片&#xff09;和labels&#xff08;标签&#xff09;。在images和labels文件夹下又分别存放三个文件夹&#xff0c;分别对应测试集、训练集、验证集&#xff…

记一次异步转同步的经历

工作中会经常遇到一些对数据进行加工的场景&#xff0c;这些数据来自很多地方&#xff0c;一般通过HTTP、RPC等方式去调用&#xff0c;数据源返回的报文也一般都是JSON、XML等格式。其中大部分数据源是同步返回&#xff0c;但有些数据源是异步返回的(也就是说数据源的数据是数据…

Android 音乐播放器(暂停、下一首、上一首)

1.编写主页面&#xff0c;使用listview组件放置音乐列表信息 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/r…

使用postman测试若依其他业务接口API—3

请求方式 如上&#xff0c;使用Get请求来获取练习题库中的所有习题数据。 请求地址 在请求路径栏输入请求地址&#xff0c;以下图为例&#xff1a; 参数体与鉴权 在Parms键入所需参数&#xff0c;其中key为键,value为键的值&#xff1a;如下图所示&#xff1a; 认证成功与失…

持续集成(CICD)- gogs仓库的部署和使用

文章目录 一、gogs的介绍二、部署gog仓库三、首次启动gogs四、登录五、创建一个非空仓库六、从仓库拉取代码到本地七、把本地编辑的代码上传到仓库 一、gogs的介绍 Gogs作为一个轻量级、易于部署和使用的自托管Git服务&#xff0c;为小型团队和个人开发者提供了一个简单而强大…

【AIGC】如何提高Prompt准确度

前言 随着人工智能的迅猛进展&#xff0c;AIGC&#xff08;通用人工智能聊天工具&#xff09;已成为多个行业中不可或缺的自然语言处理技术。Prompt作为AIGC系统的一项关键功能&#xff0c;在工具的有效运作中发挥了举足轻重的作用。本篇文章将深入探讨Prompt与AIGC之间的紧密…

python笔记_程序流程控制2

C&#xff0c;循环控制 1&#xff0c;for循环 功能&#xff1a;让代码循环运行 语法&#xff1a; for <变量> in <范围、序列>&#xff1a; <循环操作语句> 例 nums &#xff08;1,2,3,4&#xff09; <class list> for i in nums&#xff1a; print&…

Java中文件的相关知识及文件IO操作

在我们日常生活中&#xff0c;会把许多东西都称之为文件。比如&#xff0c;一份纸质报告&#xff0c;或u盘中的一些文档&#xff0c;都会把它们称为文件。那么&#xff0c;这里说的文件是以操作系统的角度出发的。在操作系统中&#xff0c;会把许多硬件设备和软件资源都抽象成“…

ubuntu20.04安装nvidia驱动真实有效(被折磨了一天一夜的肝文!!!)

ubuntu20.04安装nvidia驱动真实有效 安装前后需要注意的安装nvidia驱动的教程 安装前后需要注意的 能找到这篇帖子说明你之前肯定有过无数次方法的尝试&#xff0c;这些尝试可能会影响下面教程的有效 1.下面这个指令可能会导致ubuntu内核的更新。内核更新可能会导致你的nvidia…

机器学习:主成分分析笔记

主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种无监督的机器学习算法&#xff0c;通常用于高维数据的降维、提取主要特征、数据降噪和可视化。PCA的基本思想是将原始数据的多个变量转换为少数几个相互独立的变量&#xff08;即主成分&a…

shadertoy 游戏《来自星尘》摇杆复刻

正确的做法应该是上 noise 而不是叠加 sin 波&#xff0c;不过如果不想麻烦的话叠波还是一个不错的选择&#xff1a;整体效果如下&#xff0c;已经非常形似 直接上链接&#xff1a;Shader - Shadertoy BETA float radiusScale 0.9; float variation(vec2 v1, vec2 v2, float …

node.js 封装分页查询

node.js封装sql分页查询 方法&#xff1a; /*** 生成分页查询sql* param {string} table 表名* param {number} pageNum 分页页数 * param {number} pageSize 分页条数 * param {object} query 查询对象 例&#xff1a;{id:1,name:小明}* returns sql语句*/ const limit (ta…

Java零基础-反射

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

springboot/ssm供应商管理系统Java货物进销存管理系统web

springboot/ssm供应商管理系统Java货物进销存管理系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysq…

传感器---触摸传感器

一、模块选型概述 芯片型号&#xff1a;TTP223B 供电电压&#xff1a;3-5V 控制接口&#xff1a;共三个引脚&#xff08;GND、VCC、SIG&#xff09;&#xff0c;GND为地&#xff0c;VCC为供电电源&#xff0c;SIG为数字信号输出脚&#xff1b; PCB尺寸&#xff1a;24 x 24 mm 触…

图像传感器与信号处理——SFR算法/ISO 12233解读

图像传感器与信号处理——SFR算法/ISO 12233解读 图像传感器与信号处理——SFR算法/ISO 12233解读 1. 前言 2. 基于视觉的分辨率测量方法 3. 基于边界的SFR算法 4. 基于正弦波的SFR算法 图像传感器与信号处理——SFR算法/ISO 12233解读 SFR的全称是Spatial Frequency Response&…

蓝桥集训之统计子矩阵

统计子矩阵 核心思想&#xff1a;矩阵前缀和 双指针 用i和j双指针 遍历所有子矩阵的列用s和t双指针 遍历所有子矩阵的行求其子矩阵的和 若>k 将s向下移动 矩阵和必定减小(元素个数减少)直到满足<k 因为列一定 行数即为方案数(从t行往上数到s行 共t-s1个区间[t,t][t-1,t]…

PESTEL分析

PESTEL分析是一种用于评估宏观环境对组织或企业的影响的工具。PESTEL是对政治、经济、社会、技术、环境和法律六个方面进行分析的首字母缩写。 - 政治因素&#xff08;Political&#xff09;&#xff1a;涉及政府政策、政治稳定性、法律和法规等因素对企业的影响。 - 经济因素&…