这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧。

我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Win32是个啥东西而已。

另外,在专访中,有些人也误认为我说C++非学不可,那也不是,我也提到过了,C++的学习可以使你懂得更多知识,为你以为学习各种技术打下基础。

今天,我们来了解一下,在应用程序中,如何启动一个进程,然后把这个进程结束掉。实现这一功能有替代方案,即使用.NET库中的System::Diagnostics::Process类来完成。在Win32中,启动一个进程可以理解为创建进程,所以可以调用CreateProcess函数,结束进程则调用TerminateProcess函数。

唯一标识一个进程的是PID,而我们要对进程进行各项操作,进程也存在于内存中,也可以视为一种资源,我们知识,操作图标资源有HICON,操作位图资源有HBITMAP,同样道理,对进程所作的操作也要通过一个标识符(句柄)——HANDLE。

CreateProcess函数的最后一个参数是一个指向PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。

  1. typedef struct _PROCESS_INFORMATION {
  2. HANDLE hProcess; //进程的句柄
  3. HANDLE hThread; //主线程的句柄
  4. DWORD dwProcessId; //进程ID
  5. DWORD dwThreadId; //主线程ID
  6. } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

接下来我们要对已创建进程进行的一系列操作,都以hProcess为纽带,包括获取退出码和终止进程。

CreateProcess函数的最后两个参数都是指针,因此我们在使用时,要先定义STARTUPINFO和PROCESS_INFORMATION类型的变量,并使用ZeroMemory函数将其成员初始化。ZeroMemory函数可以将一段内存中的数据初始化为0.

示例代码如下:

  1. PROCESS_INFORMATION pro_info; //进程信息
  2. STARTUPINFO sti; //启动信息
  3. //......
  4. // 初始化两个结构体
  5. ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));
  6. ZeroMemory(&sti, sizeof(STARTUPINFO));

接着调用CreateProcess创建进程.

  1. CreateProcess(L"C:\\Windows\\System32\\calc.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pro_info);

调用成功后,PROCESS_INFORMATION结构体的hProcess就保存了被创建的进程的句柄了。

要结束进程,调用TerminateProcess函数,第一个参数就是刚才创建的时程的句柄,第二个参数是退出码,通过GetExitCodeProcess函数可以获取。

  1. DWORD exitCode; //退出码
  2. //.........
  3. GetExitCodeProcess(pro_info.hProcess,&exitCode); //获取退出码
  4. TerminateProcess(pro_info.hProcess, exitCode);
  5. // 关闭句柄
  6. CloseHandle(pro_info.hThread);
  7. CloseHandle(pro_info.hProcess);

下面是这个示例的运行结果图,完整的代码我稍后上传到资源区中。

另外,再介绍一个在应用程序中运行其他程序的方法,那就是使用Shell函数——ShellExecute。

  1. HINSTANCE ShellExecute(
  2. _In_opt_  HWND hwnd,
  3. _In_opt_  LPCTSTR lpOperation,
  4. _In_      LPCTSTR lpFile,
  5. _In_opt_  LPCTSTR lpParameters,
  6. _In_opt_  LPCTSTR lpDirectory,
  7. _In_      INT nShowCmd
  8. );

我们这里只是运行一个程序,没有其他操作,所以,带 _In_opt_的可选参数可以直接NULL,lpFile指定我们要运行程序的路径,如果是一个exe文件,那lpParameters可以指定命令行参数,但我们这里不需要,所以继续NULL,最后一个参数好理解,和ShowWindow函数一样。

于是,用ShellExecute函数打开记事本程序,当然记得包含shellapi.h。

  1. ShellExecute(NULL,NULL,L"C:\\Windows\\System32\\notepad.exe",NULL,NULL,SW_SHOWNORMAL);

看看结果,和前面效果差不多。

源代码稍后上传。

 
 
 
  • c10682

    2013-03-05 13:25#4楼

  • 这个进程控制,用 AAuto 非常方便

    XP自动玩扫雷

    1. import process;
    2. import winex;
    3. var DATABASE = 0x1005340 //棋盘基址
    4. var SETBASE = 0x01005330 //设置基址+0:雷点个数 +4:棋盘宽 +8:棋盘高
    5. var XYBASE = 0x01005118 //call参数:XYBASE:x   XYBASE+4:y
    6. var prc = process("winmine.exe") //创建扫雷进程
    7. var act = prc.remoteApi("void()", 0x010037E1);  //获取远程call
    8. var width = prc.readNumber(SETBASE+4,"INT")
    9. var height = prc.readNumber(SETBASE+8,"INT")
    10. for(j=1;height) {
    11. for(i=1;width) {
    12. n = prc.readNumber(DATABASE+i+32*j,"byte")  //棋盘基址+x+y*32=棋盘点的值
    13. /*
    14. n:棋盘点的值
    15. 未点击时:无雷:0f;;;有雷,8f (有用)
    16. 点击后:无雷:4x,x=周围雷的个数;;;有雷8x
    17. */
    18. if(n==0x0f) {
    19. prc.writeNumber(XYBASE,i,"INT")  //写X坐标
    20. prc.writeNumber(XYBASE+4,j,"INT")  //写Y坐标
    21. act();
    22. }
    23. }
    24. }

跟我一起玩Win32开发(17):启动和结束进程的更多相关文章

  1. 跟我一起玩Win32开发(转自CSDN-东邪独孤)

    跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...

  2. 跟我一起玩Win32开发(18):使用对话框的两个技巧

    相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...

  3. 跟我一起玩Win32开发(24):计时器

    有好些时间没写博客了,今天要来耍一下计时器,就是我们常说的Timer,它虽然不是什么复杂的东西,也称不 上牛X,不过,用处还是不少的,对于那些需要每隔一定时间执行一次的任务,那是相当有用. 先来认识一 ...

  4. 跟我一起玩Win32开发(19):浏览和打开文件

    在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...

  5. 跟我一起玩Win32开发(12):使用控件——单选按钮

    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...

  6. 跟我一起玩Win32开发(2):完整的开发流程

    上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...

  7. 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作

    我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...

  8. 跟我一起玩Win32开发(4):创建菜单

    也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...

  9. 跟我一起玩Win32开发(25):监视剪贴板

    自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...

随机推荐

  1. linux 命令之 watch

    watch能够帮你监測一个命令的执行结果,省得你一遍遍的手动执行.在Linux下.watch是周期性的执行下个程序.并全屏显示执行结果.你能够拿他来监測你想要的一切命令的结果变化,比方 tail 一个 ...

  2. error C2065: 'CArchiveStream' : undeclared identifier

    release:模式下 问题: 在导入JPEG文件时要使用到  CArchiveStream类  但是编译的时候会出现  'CArchiveStream'   :   undeclared   ide ...

  3. Javascript对象的技巧和陷阱

    创建对象的3种方法 方法1 直接创建 var obj = { name: "mike", age: 10 } 方法2 用new创建 var ob = new Date(); 方法3 ...

  4. Kills all phantomjs instances, disregard of their origin python关闭进程

    Python/Linux quit() does not terminate PhantomJS process · Issue #767 · SeleniumHQ/selenium https:// ...

  5. 关于在PHP中当一个请求未完成时,再发起另一个请求被阻塞的问题

    最近做项目的时候遇到个问题,就是做阿里云oss大文件上传进度条显示,因为要实时查询上传分片进度,所以在上传的同时必须要再发起查询的请求,但是一直都是所有分片上传完成后查询的请求才执行,刚开始以为是阿里 ...

  6. RedisCluster集群原理

    主从复制,数据值每个服务器都存了. 针对redis集群的解决方案, 连接这个集群,不用在乎Master了 6台redis 1.why use Redis? 减轻数据库访问压力 2.持久化 RDB(间隔 ...

  7. Microsoft.XMLHTTP基本用法

    客户端调用XMLHTTP的过程很简单,只有5个步骤:1.创建XMLHTTP对象2.打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等.客户端通过Open命令打开与服务端的服务网页 ...

  8. linux初级学习笔记四:Linux文件管理类命令详解!(视频序号:03_1)

    本节学习的命令:cat(tac),more,less,head,tail,cut,sort,uniq,wc,tr 本节学习的技能:目录管理 文件管理 日期时间 查看文本 分屏显示 文本处理 文件管理命 ...

  9. 【转】Java数字抽奖游戏核心代码

    1. [代码][Java]代码    package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个 ...

  10. codeforces 690C1 C1. Brain Network (easy)(水题)

    题目链接: C1. Brain Network (easy) time limit per test 2 seconds memory limit per test 256 megabytes inp ...