获取系统版本的函数:
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定位到的进程可能已经跟原来的进程不是同一个进程,所以,与进程通信最好使用窗口句柄或者内核对象等比较靠谱的方法

windows核心编程之进程(3)相关推荐

  1. windows核心编程之进程间共享数据

    有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存 ...

  2. 转 windows核心编程 学习笔记 目录

    windows核心编程--SEH(结构异常处理) SEH 的工作原理.         Windows 程序设计中最重要的理念就是消息传递,事件驱动.当GUI应用程序触发一个消息时,系统将把该消息放入 ...

  3. 进程——Windows核心编程学习手札系列之四

    进程 --Windows核心编程学习手札系列之四 进程是一个正在运行的程序的实例,有两个部分组成:一个是操作系统用来管理进程的内核对象,内核对象是系统用来存放关于进程的统计信息的地方:另一个是地址空间 ...

  4. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  5. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  6. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  7. 结束处理程序——Windows核心编程学习手札之二十三

    结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...

  8. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

  9. 线程本地存储器——Windows核心编程学习手札之二十一

    线程本地存储器 --Windows核心编程学习手札之二十一 C/C++运行期库使用线程本地存储器,运行期库是在多线程应用程序出现前设计的,因此运行期库里的大多数函数是用于单线程应用程序的.函数strt ...

  10. DLL的高级操作技术——Windows核心编程学习手札之二十

    DLL的高级操作技术 --Windows核心编程学习手札之二十 显示加载DLL模块: HINSTANCE LoadLibrary(PCTSTR pszDLLPathName); HINSTANCE L ...

最新文章

  1. 斯坦福大学深度学习与自然语言处理第一讲:引言
  2. 马云都退休20天了,2019年剩下不到100天了:你还没掌握Python 编程思维吗?
  3. 那两个告扎克伯格抄袭的斜杠青年,后来怎么样了?
  4. YIi 设置 ajax 验证
  5. 推荐系统实战学习速成攻略1——预测准确度
  6. vue-scroller的使用
  7. Django 上下文处理器
  8. 消息队列状态:struct msqid_ds
  9. 数据库关系代数表达式学习
  10. 基于法律裁判文书的法律判决预测
  11. 搜集70个国外搜索引擎网站,供大家学习参考
  12. 今天看完了《勇敢的心》非常感动,收集了些资料!希望大家喜欢。
  13. 台式计算机如何取消屏幕密码,电脑屏幕密码如何取消
  14. stack overflow是程序员必须会用的社区
  15. 代码即武器:美国开始控制漏洞市场
  16. mysql 5.1.69_MySQL 5.1.69/5.5.31/5.6.11 三版连发
  17. 靠死腾讯,QQ2009不能安装也不能删……
  18. 误码率matlab很大,16QAM理论误码率与实际误码率MATLAB仿真程序.pdf
  19. html鼠标自定义悬浮窗,【推荐】js+DIV悬浮窗定位到鼠标位置的源代码
  20. 在Vmware中创建苹果虚拟机

热门文章

  1. IDEA如何使用SVN插件
  2. Qt学习之路之启动浏览器
  3. 一套完整的直播系统开发、直播平台搭建的原理
  4. E4A直播盒子APP源码搭建教程之——后台源码篇
  5. java jdk 文档下载_JDK8 API文档(下载)
  6. html数字什么字体样式,css字体样式属性有哪些?
  7. Zen coding
  8. word 公式编辑器 键入技巧 | 写数学作业必备速查表
  9. python网页爬虫简单代码_python简单爬虫(示例代码)
  10. 有了这4款工具,再也不怕写SQL了,让你写出一手优雅的SQL