windows核心编程之进程(3)

获取系统版本的函数:
GetVersion返回一个DWORD类型的值,高子返回MS-DOS版本号,低字返回windows版本号
本来按照逻辑来说应该是低字的高字节返回windows的主版本号,低字节返回此版本号,但是编写该代码程序员犯了一个小错误,主版本号和次版本号的位置弄反了,高字节返回次版本号,低字节返回主版本号
由于GetVersion的混乱,MicroSoft推出了GetVersionEx
GetVersionEx(POSVERSIONINFO pVersionInformation);
typedef struct _OSVERSIONINFO{
DWORD dwOSVersionInfoSize; //结构的大小
DWORD dwMajorVersion; //主版本号
DWORD dwMinorVersion; //次版本号
DWORD dwBuildNumber; //不重要
DWORD dwPlatformId; //不重要
TCHAR szCSDVersion[ 128 ];
} OSVERSIONINFO;
使用的时候要将结构的dwOSVersionInfoSize的大小设为sizeof(OSVERSIONINFO),其余设为0
现在贴上我的代码

#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;int main()
{char buf[MAX_PATH];GetCurrentDirectory(MAX_PATH,buf);cout<<buf<<endl;cout<<"测试版本号:"<<_osver<<endl;cout<<"主要版本号"<<_winmajor<<endl;cout<<"次要版本号:"<<_winminor<<endl;DWORD version=GetVersion();WORD versionex=LOWORD(version);cout<<int(LOBYTE(versionex))<<"."<<int(HIBYTE(versionex))<<endl;OSVERSIONINFO ovs={sizeof(ovs)};GetVersionEx(&ovs);cout<<ovs.dwMajorVersion<<"."<<ovs.dwMinorVersion<<endl;system("pause");
}

这里写图片描述
还有一个VerifyVersionInfo函数,但是在我的XP vc6.0平台上始终不好使,在win7 vs2013平台上好使,我也不清楚其原因,暂且不做讲解,等以后知道了原因再做讲解

BOOL CreateProcess(
LPCTSTR lpApplicationName, // 应用程序的名称
LPTSTR lpCommandLine, // 命令行
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性
BOOL bInheritHandles, // 是否继承可继承的句柄
DWORD dwCreationFlags, // 创建标志,0表示正常,CREATE_SUSPEND表示创建即挂起线程
LPVOID lpEnvironment, //指向环境块的指针
LPCTSTR lpCurrentDirectory, // 指向当前路径的指针
LPSTARTUPINFO lpStartupInfo, // 指向启动信息的指针
LPPROCESS_INFORMATION lpProcessInformation // 指向进程信息的指针
);
lpApplicationName:应用程序的名称,只能写全名
lpCommandLine:命令行,CreatePrcocess查看命令行的第一个标记,并设定该标记为想运行的程序的可执行文件的名字,该参数按照以下顺序搜索exe文件
1.包含调用进程的exe文件的目录
2.调用进程的当前目录
3.windows的系统目录
4.windows目录
5.path环境变量中列出的目录
综合以上来说,这两个参数都可以用来设定可执行文件的名称,但是命令行明显更具有优势
有时这两个参数还可配合用来打开文件
示例代码:

#include "stdafx.h"
#include <Windows.h>
#include <Psapi.h>
#include <TlHelp32.h>
#include <iostream>
#include <stdlib.h>
#pragma comment(lib,"Psapi.lib")
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{PROCESS_INFORMATION pi;STARTUPINFO stp = { 0 };stp.cb = sizeof(STARTUPINFO);CreateProcess(TEXT("C:\\Program Files (x86)\\Baofeng\\StormPlayer\\StormPlayer.exe"), TEXT("StormPlayer F:\\名侦探柯南全集\\名侦探柯南(121-160)\\名侦探柯南  132→→魔术爱好者杀人事件(事件编).flv"), NULL, NULL, false, 0, NULL, NULL, &stp, &pi);system("pause");return 0;
}

OK 顺利打开视频文件
这里写图片描述
设父进程为进程A
lpProcessAttributes参数用于设置进程的安全属性,该参数可设置这个句柄能否被继承,如果当进程A创建进程B的时候设置lpProcessAttributes的成员属性bInheritHandles为true,当进程A再次用CreateProcess创建子进程进程C的时候,设这个函数的第5个参数bInheritHandles为true就可继承父进程的句柄表中的进程B的句柄
反之,如果在进程A创建进程B的时候设置lpProcessAttributes的成员属性bInheritHandles为false,当进程A再次用CreateProcess创建子进程进程C的时候,不管设这个函数的第5个参数bInheritHandles为true或者false都无法继承父进程的句柄表中的进程B的句柄

dwCreationFlags:
DEBUG_PROCESS:父进程想要调试任何子进程或者子进程生成的任何进程,当子进程或者子子进程发生事件时,将会通知父进程(调试程序)
DEBUG_ONLY_THIS_PROCESS:调试程序只告诉紧靠父进程的子进程中发生的任何特定事件
CREATE_SUSPEND:创建即把进程挂起
DETACHED_PROCESS:阻止子进程对父进程控制台窗口的访问(一般不设定这个标志,子进程默认访问父进程的控制台窗口)
CREATE_NEW_CONSOLE:为子进程创建一个新的控制台窗口,我们发现这个标志的作用和上个标志有点相似,所以,这两个不能一起用
CREATE_NO_WINDOW:不要为子进程创建任何控制台窗口
CREATE_NEW_PROCESS_GROUP:假设有很多控制台窗口,按下Crtl+C或者Ctrl+Break,会通知所有的控制台窗口终止进程的执行,当创建进程的时候,如果设定本标志,就会把进程放入新的组,向这个组中的某个进程传递Ctrl+C或者Ctrl+Break的时候,只会使这个组的所有进程终止执行
CREATE_DEFAULT_ERROR_MODE:子进程使用默认的错误模式,不继承父进程的错误模式
还可设置优先级,不过系统创建进程时会设定默认优先级,大多数情况下不需要设定,系统自动调配的一般就够用了
这里写图片描述
lpEnvironment:环境变量的指针,不过这个一般不设置,继承父进程的就好
lpCurrentDirectory:指向当前目录的指针,这个一般也用不着设置,继承父进程的就好
lpStartupInfo
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
这里写图片描述
这里写图片描述
这里写图片描述
列出这么多一般用不着,使用时,设置第一个成员属性为该结构的大小,其余设为0就OK
lpProcessInformation
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
使用时把结构的所有成员全部设为0即可
另外进程ID是独一无二的,进程ID和线程ID也绝不可能相同,但是当一个进程或线程对象被释放时,他的ID可能会被分配给其他的进程,另外ID绝不可能为0
由于ID的可重用性,你用ID定位到的进程可能已经跟原来的进程不是同一个进程,所以,与进程通信最好使用窗口句柄或者内核对象等比较靠谱的方法

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2023CCPC河南省赛 VP记录

感觉现在的xcpc&#xff0c;风格越来越像CF&#xff0c;不是很喜欢&#xff0c;还是更喜欢多点算法题的比赛 VP银了&#xff0c;VP银也是银 感觉省赛都是思维题&#xff0c;几乎没有算法题&#xff0c;感觉像打了场大型的CF B题很简单没开出来&#xff0c;一直搞到最后&…

大学计算机专业 学习Python学习路线图(最新版)

这是我刚开始学习python时的一套学习路线&#xff0c;从入门到上手。&#xff08;不敢说精通&#xff0c;哈哈~&#xff09; 希望对大家有帮助哈~ 大家需要高清得完整python学习路线可以 一、Python入门、环境搭建、变量、数据类型 二、数据库编程 三、Linux系统 四、网页编…

哪些手机待办事项软件可以记录备忘并设置提醒?

当下手机软件的种类那么多&#xff0c;为什么有那么多人使用手机待办事项软件呢&#xff1f;原因很简单&#xff0c;因为这类软件可以记录备忘并设置提醒&#xff0c;非常适合哪些喜欢提前规划待办事项的人使用。但是&#xff0c;面对如此多的手机待办事项软件&#xff0c;具体…

【HTML】第 2 节 - HTML 标签

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、标题标签 3、段落标签 4、文本格式化标签 5、图像标签 5.1、基本作用 5.2、属性 6、超链接标签 7、音频标…

Vivado下时序逻辑模块的仿真

文章目录 D触发器两级D触发器带异步复位的D触发器带异步复位和同步置数的D触发器移位寄存器单口RAM伪双口RAM真双口RAM单口ROM 组合逻辑电路在逻辑功能上特点是任意时刻的输出仅仅取决于当前时刻的输入&#xff0c;与电路原来的状态无关。 时序逻辑在逻辑功能上的特点是任意时刻…

单元测试方法-cmockery实践

目录 单元测试概念 引子 定义 内容 方法 单元测试模型 测试模型构建 单元测试工具简介 Cmockery使用介绍 简介 使用 VPBX实践 UT框架搭建 目录 编译&#xff1a; 实例demo 例1&#xff1a; 例2&#xff1a; 例3&#xff1a; 例4&#xff1a; 例5&#xff…

从0开始搭建vue3+vite+ts+pinia项目

目录 项目搭建选项 项目搭建步骤 本地开发环境 Vite脚手架构建项目 关联Git仓库 开发工具 安装pinia 安装Sass 安装Vant-UI 安装postcss-pxtorem&#xff08;移动端项目&#xff09; 安装axios 本地调试 环境变量 本地代理 全局UI组件 路由中间件 项目部署 n…

layui(2)----页面元素

水平导航栏 依赖加载模块&#xff1a;element <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

AcWing 回转游戏 dfs IDA* 剪枝 统一操作 java

&#x1f351; 算法题解专栏 &#x1f351; 回转游戏 如下图所示&#xff0c;有一个 # 形的棋盘&#xff0c;上面有 1 , 2 , 3 1,2,3 1,2,3 三种数字各 8 8 8 个。 给定 8 8 8 种操作&#xff0c;分别为图中的 A s i m H A \\sim H AsimH。 这些操作会按照图中字母和箭头…

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示 如下图所示,在博途中新建项目后,添加自己所需的数据类型,然后选中该数据类型,右击选择“从块生成源“—”仅所选块“, 如下图所示,设置文件名后点击保存, 如下图所示,选中需要导出的DB块,右击选…

vue 自定义el-table穿梭框功能

一、需求描述&#xff1a;前段时间接到一个需求是点击做一个类似穿梭框的表格点击选中功能&#xff0c;弹框的左边是全部数据展示&#xff0c;点击表格行数据可以选中自动增加到右边的已选框&#xff0c;并且可以手动删除、重置选中数据。点击确定后到展示到主页面&#xff0c;…

Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题&#xff08;持续更新中&#xff09; 线程与线程池Java锁机制轻量级锁重量级锁 线程与线程池 一、线程 1、线程的状态 2、线程的创建方式 &#xff08;1&#xff09;继承 Thread 类&#xff1b; &#xff08;2&#xff09;实现 Runnable 接口&#…

IDEA2023.1配置Git

一、前言 在使用新设备整理git项目时&#xff0c;报了以下问题&#xff0c;在整理项目的同时&#xff0c;做下记录。 二、下载git 2.1.官网下载git 官网下载地址&#xff1a; git官网&#xff0c;如下图所示&#xff1a; 如果选方法二&#xff0c; 接下来会让选择系统&#…

【cocos精品】《三国之刃》:腾讯首款三国炫技格斗手游

基于cocos引擎开发的《三国之刃》是腾讯独家代理的三国题材的动作格斗手游。独创的自由组合战技系统&#xff0c;配合特色的兵器和灵兽技能&#xff0c;可搭配出上万种格斗套路&#xff0c;让您的战斗酣畅淋漓又变幻莫测。清爽灵活的操作&#xff0c;无锁定技术PK&#xff0c;更…

java开发街机三国志_入坑必看《街机三国志》游戏初期重点讲解

《街机三国志》为了让新手更好的了解游戏&#xff0c;设立里相关的新手指引&#xff0c;引导新入门的玩家完成各种任务与基础的系统教学。只凭新手教学是没办法在初期阶段积累足够的资源的。本次小编特意整理了一些新手教程中没有提及的重点&#xff0c;希望帮助玩家们更好的开…

搜索引擎三国鼎立:百度 vs 360 vs 搜狗

理论上说&#xff0c;搜索市场不存在平分秋色的可能&#xff0c;不管份额如何接近&#xff0c;最终必然是东风压倒西风&#xff0c;这一点在全球市场都未见过反例。雅虎在日本和台湾独占鳌头&#xff0c;Naver在韩国有压倒性优势&#xff0c;Yandex称霸俄罗斯。谷歌在全球大部分…

街机三国志隐藏人物刘备_隐藏的人物

街机三国志隐藏人物刘备 最初的程序员的故事将永远不为人知 背后没有外套的男人是梅尔凯&#xff08;Mel Kaye&#xff09;&#xff0c;埃德纳瑟&#xff08;Ed Nather&#xff09;为他写了他永恒的程序员绝版经典著作《故事》 。 那一年是1960年&#xff0c;尽管存在有关他编…

Java霸王的大陆梦幻版_三国志霸王的大陆,喜欢三国的进

三国是中国历史上英雄辈出的时代&#xff0c;《霸王的大陆》这款移植自Fc的战棋游戏更是中国手游java游戏的No.1!该游戏内容极其丰富&#xff0c;对玩家的要求很高&#xff0c;因此这完全是一款符合游戏高手要求的大型单机游戏。以下是这款游戏的核心攻略&#xff0c;只要稍加留…

无可用下载链接_经典大全合集500个街机游戏大全下载

经典大全合集500个街机游戏大全下载 WinKawaks1.45模拟器 游戏链接 链接:https://pan.baidu.com/s/1MZ3_Gv825dtswcGXr006zQ 提取码:zhrk 一、游戏介绍

linux模拟器玩三国战记,三国战纪风云再起街机版

三国战纪风云再起街机版带你回忆最初玩三国街机游戏的乐趣,多种对战玩法轻松上手,在三国战纪风云再起街机版手机游戏里面玩家可以随便选择一个角色进入战斗,强烈的打击感绝对让你爱不释手,在指尖畅享超酷的格斗盛宴。 三国战纪风云再起街机版介绍 三国战纪风云再起街机版是…