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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值