1、windows下获取PID
windows下获取PID比较简单,可以直接通过TlHelp32.h内的Process32First + Process32Next来遍历进程获取PROCESSENTRY32(存放快照进程信息的一个结构体)结构体信息,对比进程名称获取对应的PID。
调用以上方法记得先 #include <Windows.h> #include <TlHelp32.h>
PROCESSENTRY32解析:
typedef struct tagPROCESSENTRY32
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
CHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
成员 | 解析 |
---|
dwSize | 结构体的大小 |
cntUsage | 此进程的引用计数(已经不再被使用,总是设置为零) |
th32ProcessID | 进程ID(我们需要的pid) |
th32DefaultHeapID | 进程默认堆ID(已经不再被使用,总是设置为零) |
th32ModuleID | 进程模块ID(已经不再被使用,总是设置为零) |
cntThreads | 此进程开启的线程计数 |
th32ParentProcessID | 父进程的ID |
pcPriClassBase | 线程优先权 |
dwFlags | 已经不再被使用 |
szExeFile | 进程的可执行文件名称。要获得可执行文件的完整路径,应调用Module32First函数,再检查其返回的MODULEENTRY32结构的szExePath成员。但是,如果被调用进程是一个64位程序,您必须调用QueryFullProcessImageName函数去获取64位进程的可执行文件完整路径名 |
实现
int getPidByName(const char* processName )
{
HANDLE hSnapshot;
PROCESSENTRY32 lppe;
BOOL Found;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
lppe.dwSize = sizeof(PROCESSENTRY32);
Found = Process32First(hSnapshot, &lppe);
char mProce[MAX_PATH] = "";
int pid = -1;
while (Found)
{
strcpy(mProce, processName);
strcat(mProce, ".exe");
if (strcmp(mProce, lppe.szExeFile) == 0)
{
Found = TRUE;
pid = lppe.th32ProcessID;
break;
}
Found = Process32Next(hSnapshot, &lppe);
}
CloseHandle(hSnapshot);
return pid;
}
2、获取进程路径
实现
#define MAX_PATH 256
void GetProcessPath(DWORD nPID, char* szPathName, int pathlen)
{
DWORD dwMajorVersion = 0;
DWORD dwMinorVersion = 0;
OSVERSIONINFOEX osver = { 0 };
osver.dwOSVersionInfoSize = sizeof(osver);
::GetVersionEx((OSVERSIONINFO*)&osver);
dwMajorVersion = osver.dwMajorVersion;
dwMinorVersion = osver.dwMinorVersion;
char szFileName[MAX_PATH] = {0};
HANDLE hProcess = NULL;
HMODULE hModule = NULL;
DWORD cbReturn = 0;
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
false,
nPID);
DWORD dwError = 0;
BOOL bSuccessProcess = EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbReturn);
if (!bSuccessProcess)
{
dwError = GetLastError();
}
memset(szFileName, 0, sizeof(szFileName));
memset(szPathName, 0, pathlen);
if (hModule != NULL)
{
if (dwMajorVersion < 5)
{
DWORD dwGetModuleBaseName = GetModuleFileNameEx(hProcess, hModule, szPathName, pathlen);
}
if (dwMajorVersion == 5)
{
GetProcessImageFileName(hProcess, szPathName, pathlen);
}
else if (osver.dwMajorVersion >= 6)
{
DWORD dwPathNameSize = pathlen;
bSuccessProcess = QueryFullProcessImageName(hProcess, 0, szPathName, &dwPathNameSize);
}
if (!bSuccessProcess)
{
dwError = GetLastError();
}
}
if(hProcess)
CloseHandle(hProcess);
}
3、进程启停
启动实现
int startProc(const char* name,int argc = 0,char* param[] = NULL);
int startProc(const char* name,int argc,char* param[])
{
std::string strPath = m_ProcessPath + name;
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(si)};
DWORD dwExitCode;
HANDLE h_MapGeneralArea;
char cCommand[MAX_PATH] = {0};
sprintf_s(cCommand,"%s.exe",strPath.c_str());
for (int i = 0;i<argc;i++)
{
sprintf_s(cCommand,"%s %s",cCommand,param[i]);
}
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
BOOL ret = CreateProcess(NULL, cCommand, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret){
return pi.dwProcessId;
}
else{
return -1;
}
}
停止实现
void CProcessCtrl::stopProc( int pid )
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
if (hProcess != NULL)
{
if(TerminateProcess(hProcess,0))
CloseHandle(hProcess);
else
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL);
LocalFree(lpMsgBuf);
}
}
}
4、文件操作
文件的操作网上很多,这里写下文件夹的拷贝删除
拷贝实现
BOOL CopyFolder(LPCTSTR lpszFromPath,LPCTSTR lpszToPath)
{
int nLengthFrm = strlen(lpszFromPath);
char *NewPathFrm = new char[nLengthFrm+2];
strcpy(NewPathFrm,lpszFromPath);
NewPathFrm[nLengthFrm] = '\0';
NewPathFrm[nLengthFrm+1] = '\0';
SHFILEOPSTRUCT FileOp;
ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
FileOp.fFlags = FOF_NOCONFIRMATION ;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = NewPathFrm;
FileOp.pTo = lpszToPath;
FileOp.wFunc = FO_COPY;
int ret = SHFileOperation(&FileOp);
char errdat[128];
sprintf(errdat,"拷贝文件出错,错误码:%d",ret);
if (ret!=0)
{
DPLOG_INFO("拷贝文件",errdat);
Sleep(100);
delete []NewPathFrm;
return FALSE;
}
Sleep(100);
delete []NewPathFrm;
return TRUE;
}
删除实现
BOOL MyDeleteFile(char* lpszPath)
{
SHFILEOPSTRUCT shDelFile;
memset(&shDelFile,0,sizeof(SHFILEOPSTRUCT));
shDelFile.fFlags |= FOF_SILENT;
shDelFile.fFlags |= FOF_NOERRORUI;
shDelFile.fFlags |= FOF_NOCONFIRMATION;
TCHAR buf[_MAX_PATH + 1] = {0};
_tcscpy(buf, lpszPath);
buf[_tcslen(buf)+1]=0;
shDelFile.wFunc = FO_DELETE;
shDelFile.pFrom = buf;
shDelFile.pTo = NULL;
{
shDelFile.fFlags |= FOF_ALLOWUNDO;
}
int retval = SHFileOperation(&shDelFile);
return retval == 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)