Welcome

首页 / 软件开发 / C++ / Windows编程:开启/关闭/遍历程序的类 代码(C++)

Windows编程:开启/关闭/遍历程序的类 代码(C++)2014-11-16类包含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> //snapshotclass 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! 
");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;}
输出:

作者:csdn博客 Spike_King