跟我一起玩Win32开发(17):启动和结束进程
这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧。
我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Win32是个啥东西而已。
另外,在专访中,有些人也误认为我说C++非学不可,那也不是,我也提到过了,C++的学习可以使你懂得更多知识,为你以为学习各种技术打下基础。
今天,我们来了解一下,在应用程序中,如何启动一个进程,然后把这个进程结束掉。实现这一功能有替代方案,即使用.NET库中的System::Diagnostics::Process类来完成。在Win32中,启动一个进程可以理解为创建进程,所以可以调用CreateProcess函数,结束进程则调用TerminateProcess函数。
唯一标识一个进程的是PID,而我们要对进程进行各项操作,进程也存在于内存中,也可以视为一种资源,我们知识,操作图标资源有HICON,操作位图资源有HBITMAP,同样道理,对进程所作的操作也要通过一个标识符(句柄)——HANDLE。
CreateProcess函数的最后一个参数是一个指向PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。
- typedef struct _PROCESS_INFORMATION {
- HANDLE hProcess; //进程的句柄
- HANDLE hThread; //主线程的句柄
- DWORD dwProcessId; //进程ID
- DWORD dwThreadId; //主线程ID
- } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
接下来我们要对已创建进程进行的一系列操作,都以hProcess为纽带,包括获取退出码和终止进程。
CreateProcess函数的最后两个参数都是指针,因此我们在使用时,要先定义STARTUPINFO和PROCESS_INFORMATION类型的变量,并使用ZeroMemory函数将其成员初始化。ZeroMemory函数可以将一段内存中的数据初始化为0.
示例代码如下:
- PROCESS_INFORMATION pro_info; //进程信息
- STARTUPINFO sti; //启动信息
- //......
- // 初始化两个结构体
- ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));
- ZeroMemory(&sti, sizeof(STARTUPINFO));
接着调用CreateProcess创建进程.
- CreateProcess(L"C:\\Windows\\System32\\calc.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pro_info);
调用成功后,PROCESS_INFORMATION结构体的hProcess就保存了被创建的进程的句柄了。
要结束进程,调用TerminateProcess函数,第一个参数就是刚才创建的时程的句柄,第二个参数是退出码,通过GetExitCodeProcess函数可以获取。
- DWORD exitCode; //退出码
- //.........
- GetExitCodeProcess(pro_info.hProcess,&exitCode); //获取退出码
- TerminateProcess(pro_info.hProcess, exitCode);
- // 关闭句柄
- CloseHandle(pro_info.hThread);
- CloseHandle(pro_info.hProcess);
下面是这个示例的运行结果图,完整的代码我稍后上传到资源区中。
另外,再介绍一个在应用程序中运行其他程序的方法,那就是使用Shell函数——ShellExecute。
- HINSTANCE ShellExecute(
- _In_opt_ HWND hwnd,
- _In_opt_ LPCTSTR lpOperation,
- _In_ LPCTSTR lpFile,
- _In_opt_ LPCTSTR lpParameters,
- _In_opt_ LPCTSTR lpDirectory,
- _In_ INT nShowCmd
- );
我们这里只是运行一个程序,没有其他操作,所以,带 _In_opt_的可选参数可以直接NULL,lpFile指定我们要运行程序的路径,如果是一个exe文件,那lpParameters可以指定命令行参数,但我们这里不需要,所以继续NULL,最后一个参数好理解,和ShowWindow函数一样。
于是,用ShellExecute函数打开记事本程序,当然记得包含shellapi.h。
- ShellExecute(NULL,NULL,L"C:\\Windows\\System32\\notepad.exe",NULL,NULL,SW_SHOWNORMAL);
看看结果,和前面效果差不多。
源代码稍后上传。
- 本文已收录于以下专栏:
- 跟我一起玩Win32开发

-
c10682
2013-03-05 13:25#4楼
- 这个进程控制,用 AAuto 非常方便
XP自动玩扫雷
- import process;
- import winex;
- var DATABASE = 0x1005340 //棋盘基址
- var SETBASE = 0x01005330 //设置基址+0:雷点个数 +4:棋盘宽 +8:棋盘高
- var XYBASE = 0x01005118 //call参数:XYBASE:x XYBASE+4:y
- var prc = process("winmine.exe") //创建扫雷进程
- var act = prc.remoteApi("void()", 0x010037E1); //获取远程call
- var width = prc.readNumber(SETBASE+4,"INT")
- var height = prc.readNumber(SETBASE+8,"INT")
- for(j=1;height) {
- for(i=1;width) {
- n = prc.readNumber(DATABASE+i+32*j,"byte") //棋盘基址+x+y*32=棋盘点的值
- /*
- n:棋盘点的值
- 未点击时:无雷:0f;;;有雷,8f (有用)
- 点击后:无雷:4x,x=周围雷的个数;;;有雷8x
- */
- if(n==0x0f) {
- prc.writeNumber(XYBASE,i,"INT") //写X坐标
- prc.writeNumber(XYBASE+4,j,"INT") //写Y坐标
- act();
- }
- }
- }
跟我一起玩Win32开发(17):启动和结束进程的更多相关文章
- 跟我一起玩Win32开发(转自CSDN-东邪独孤)
跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...
- 跟我一起玩Win32开发(18):使用对话框的两个技巧
相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...
- 跟我一起玩Win32开发(24):计时器
有好些时间没写博客了,今天要来耍一下计时器,就是我们常说的Timer,它虽然不是什么复杂的东西,也称不 上牛X,不过,用处还是不少的,对于那些需要每隔一定时间执行一次的任务,那是相当有用. 先来认识一 ...
- 跟我一起玩Win32开发(19):浏览和打开文件
在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...
- 跟我一起玩Win32开发(12):使用控件——单选按钮
今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...
- 跟我一起玩Win32开发(2):完整的开发流程
上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...
- 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作
我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...
- 跟我一起玩Win32开发(4):创建菜单
也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...
- 跟我一起玩Win32开发(25):监视剪贴板
自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...
随机推荐
- Android自己定义圆角ImageView
我们常常看到一些app中能够显示圆角图片.比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源.我们也能够自己通过程序实现的,以下介绍一个自己定义圆角Imag ...
- java之集合Collection 具体解释之4
package cn.itcast_04; public class Student { private String name; private int age; public Student() ...
- CXF发布在Web服务
1.下载apache-cxf-3.1.4,将jar引入新工程中. 2.People.java package com.soap.server; import java.util.Date; impor ...
- 【献给CWNU的师弟】Web篇
2014年10月8日 献给CWNU的师弟
- JAVA学习第十九课(java程序的异常处理 (二))
异常处理的捕捉形式: 这是能够对异常进行针对性处理的方式 六.try.catch的理解 详细格式: try { //须要被检測异常的代码 } catch(异常类 变量)//改变量用于接受发生异常的对象 ...
- How MySQL Opens and Closes Tables refuse connections 拒绝连接的原因 file descriptors
MySQL :: MySQL 5.7 Reference Manual :: 8.4.3.1 How MySQL Opens and Closes Tables https://dev.mysql.c ...
- 1250太小了 mysql 并发
SHOW VARIABLES LIKE '%connection%'; character_set_connection utf8mb4collation_connection utf8mb4_gen ...
- JAVA变量存储
1.java变量存储域 java变量的存储区域主要放在以下几个地方: (1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定. ...
- 基于Delphi7 WebService 在Apache发布及Apache使用说明
基于Delphi7 WebService 在Apache 发布及Apache 使用说明 qq:394251165 前段时间,需要将基于Delphi7 WebService 发布在Apache, 很是苦 ...
- Jackson序列化和反序列化
1,下载Jackson工具包(jackson-core-2.2.3.jar jackson-annotations-2.2.3.jar jackson-databind-2.2.3.jar ) j ...