Windows编程 - 开启/关闭/遍历程序的类 代码(C++)

开启/关闭/遍历程序的类 代码(C++)

本文地址: http://blog.csdn.net/caroline_wendy

类包含4个函数, 启动程序, 遍历所有进程, 关闭程序, 遍历进程依赖的动态链接库.

示例: Image.exe是预先生成的可执行程序(exe), 启动程序, 间隔5秒, 关闭程序.

使用方法参加测试程序.

代码:

/*
 * process.h
 *
 *  Created on: 2014.06.08
 *      Author: Spike
 */

/*vs 2012*/

#ifndef TRAVERSEPROCESSMODEL_H
#define TRAVERSEPROCESSMODEL_H

#include <iostream>
#include <iomanip>
#include <string>
#include <map>

#include <windows.h>
#include <TlHelp32.h>     //snapshot

class Process
{
public:
	bool startProcess (const std::string _name);
	bool terminateProcess (const std::string _name);
	bool traverseModels (const std::string _name);
	bool traverseProcesses (std::map<std::string, int>& _nameID);
};

#endif //TRAVERSEPROCESSMODEL_H

/*
 * process.cpp
 *
 *  Created on: 2014.06.08
 *      Author: Spike
 */

/*vs 2012*/

#include "process.h"

using namespace std;

bool Process::startProcess (const std::string name)
{
	STARTUPINFO si; //参数设置
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_SHOW;

	PROCESS_INFORMATION pi; //参数结束

	/*printf("Please enter the name of process to start:");
	std::string name;
	cin >> name;*/

	if (!CreateProcessA(NULL, (LPSTR)name.c_str(), NULL, NULL, FALSE, 0,NULL,NULL,&si,&pi)) {
		cout<<"Start Process Error!"<<endl;
		return false;
	} else {
		cout<<"Start Process Sucess!"<<endl;
	}
	return true;
}

bool Process::traverseProcesses (std::map<std::string, int>& _nameID)
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);

	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE) {
		std::cout << "CreateToolhelp32Snapshot Error!" << std::endl;;
		return false;
	}

	BOOL bResult =Process32First(hProcessSnap, &pe32);

	while(bResult)
	{
		std::string name = pe32.szExeFile;
		int id = pe32.th32ProcessID;

		//std::cout << "Process Name:" << name << "  " << "ProcessID:" << id<< std::endl;

		_nameID.insert(std::pair<string, int>(name, id)); //字典存储
		bResult = Process32Next(hProcessSnap,&pe32);
	}

	CloseHandle(hProcessSnap);

	return true;
}

bool Process::terminateProcess (const std::string _name)
{
	std::map<std::string, int> nameID;

	if (!traverseProcesses(nameID)) {
		cout << "Traverse Processes Error!" << endl;
	}

	DWORD dwId;

	/*printf("Please enter the name of process to terminal:");
	std::string name;
	cin >> name;*/

	dwId = nameID[_name];

	BOOL bRet = FALSE;

	HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwId);
	if(hProcess != NULL)
		bRet = TerminateProcess(hProcess, 0);
	CloseHandle(hProcess);

	if(bRet){
		std::cout << "Terminate Process Success!" << std::endl;
	} else {
		std::cout << "Terminate Process Error!" << std::endl;
		return false;
	}

	return true;
}

bool Process::traverseModels (const std::string _name)
{
	std::map<std::string, int> nameID;

	if (!traverseProcesses(nameID)) {
		cout << "Traverse Processes Error!" << endl;
	}

	DWORD dwId;

	/*printf("Please enter the name of process to traverse processmodels:");
	std::string name;
	cin >> name;*/

	dwId = nameID[_name];

	HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwId);
	if(hModuleSnap == INVALID_HANDLE_VALUE){
		printf("CreateToolhelp32SnapshotError! \n");
		return false;
	}

	MODULEENTRY32 module32;
	module32.dwSize = sizeof(module32);
	BOOL bResult = Module32First(hModuleSnap, &module32);

	while(bResult){
		std::wcout << "Module:" << std::left << std::setw(25) << module32.szModule << "  "
			<< endl << "Path:" << module32.szExePath << std::endl;
		bResult = Module32Next(hModuleSnap, &module32);
	}

	CloseHandle(hModuleSnap);

	return true;

}

测试代码:

/*
 * main.cpp
 *
 *  Created on: 2014.06.08
 *      Author: Spike
 */

/*vs 2012*/

#include "process.h"

using namespace std;

int main(void)
{
	Process tpm;

	const std::string name = "D:/Test/Image.exe";
	const std::string programme = "Image.exe";

	if (!tpm.startProcess(name)) {
		cout << "Start Processe Error!" << endl;
	}

	Sleep(5000);

	if(!tpm.terminateProcess(programme)){
		cout << "Terminate Process Error!" << endl;
	}

	return 0;
}

输出:

Windows编程 - 开启/关闭/遍历程序的类 代码(C++),布布扣,bubuko.com

时间: 2024-07-28 17:03:40

Windows编程 - 开启/关闭/遍历程序的类 代码(C++)的相关文章

windows编程之目录遍历

利用windows的API,FindFirstFile和FileNextFile,採用递归遍历指定目录中的全部文件及目录,第一次windows编程.代码写的非常臃肿难看.请大家多多包涵! #include<cstdio> #include<cstring> #include<iostream> #include<windows.h> #define MAXN 100005 using namespace std; void surf(WIN32_FIND_D

LINUX服务开启关闭建议

1.操作系统centos5.5 服务名称 功能 默认 建议 备注 NetworkManager 用于自动连接网络 关闭 关闭 对服务器没用 acpid 电源的开关等检测管理 开启 关闭 对服务器没用 anacron 一种计划任务管理 开启 开启 apmd 高级电源管理 开启 开启 atd 在指定时间执行命令 开启 关闭 如果用crond,则可关闭它 auditd 开启 自定 如果用selinux,需要开启它 autofs 文件系统自动加载.卸载 开启 自定 只在需要时开启它,可以停止 avahi

Windows编程 - 遍历程序使用的动态链接库(dll) 代码(C++)

遍历程序使用的动态链接库(dll) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 遍历程序使用的动态链接库(dll), 首先需要遍历所有进程, 匹配进程名称与进程ID, 然后根据进程名称, 输出所有使用的库(dll). 示例中Image.exe是预先启动的程序. 代码包含遍历进程的代码, 和输出动态链接库(dll)的代码. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike

Windows编程 - 终止可执行(exe)程序 代码(C++)

终止可执行(exe)程序 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 终止可执行(exe)程序, 首先遍历进程, 找到进程名称对于的进程ID号, 然后根据进程ID, 终止进程. 示例代码: 包括遍历进程代码, 和关闭代码. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <

Windows Socket编程示例-TCP示例程序

前面一部分是介绍,后面有示例 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 使用TCP

windows编程之文件夹遍历

利用windows的API,FindFirstFile和FileNextFile,采用递归遍历指定文件夹中的所有文件及文件夹,第一次windows编程,代码写的很臃肿难看,请大家多多包涵! <pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<iostream> #include<windows.h> #define

unity中开启和关闭协同程序

协同程序这个好处大大的,用过的人都说好 转载出处:http://wg2009perfect.blog.163.com/blog/static/127997663201211111222126/ 一.什么是协同程序 协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行.换句话说,开启协同程序就是开启一个线程. 二.协同程序的开启与终止 在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehavi

Windows 编程,程序编译使用的命令行工具。

Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件中包含了对程序中所使用资源(菜单.图标等)的描述.rc.exe将.rc格式的文件编译为.res文件,供链接器链接到可执行文件中. 3.link.exe是Windows平台的链接器,它将cl.exe编译生成的obj文件,资源编译器生成的.res文件,以及lib目录下的lib文件等链接成可执行的exe文

Windows编程 - 启动可执行(exe)程序 代码(C++)

启动可执行(exe)程序 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 通过输入程序位置启动可执行(exe)程序, 使用windows的CreateProcess()函数, 即可. 示例是调用预先生产的可执行(exe)程序. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <