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

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;
}

输出: