64位系统下C++获取当前所有进程的完整路径

64位系统下C++获取当前所有进程的完整路径

利用GetModuleFileName在32位机器上开发的程序,在64位机器上运行的时候,GetModuleFileName和GetModuleFileNameEX获取信息失败。解决64位机器获取失败的这个问题,有两个方法:
1.用64位机器开发64位的程序,用GetModuleFileNameEX方法。
2.用 QueryFullProcessImageName (Vista and up) or GetProcessImageFileName (XP and up)。
GetProcessImageFileName可以在xp和win7 32位和64位都能获取进程路径,GetModuleFileNameEx只能获取32位进程路径,但GetProcessImageFileName获取的路径都是包含设备名的路径,因此我们还要转换成一下,因此我们最终的GetProcessFullPath函数这样的。

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <tchar.h>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")

BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)
{
	TCHAR			szDriveStr[500];
	TCHAR			szDrive[3];
	TCHAR			szDevName[100];
	INT				cchDevName;
	INT				i;
	
	//检查参数
	if(!pszDosPath || !pszNtPath )
		return FALSE;

	//获取本地磁盘字符串
	if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
	{
		for(i = 0; szDriveStr[i]; i += 4)
		{
			if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))
				continue;

			szDrive[0] = szDriveStr[i];
			szDrive[1] = szDriveStr[i + 1];
			szDrive[2] = '\0';
			if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备名
				return FALSE;

			cchDevName = lstrlen(szDevName);
			if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中
			{
				lstrcpy(pszNtPath, szDrive);//复制驱动器
				lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径

				return TRUE;
			}			
		}
	}

	lstrcpy(pszNtPath, pszDosPath);
	
	return FALSE;
}
//获取进程完整路径
BOOL GetProcessFullPath(DWORD dwPID)
{
	TCHAR		szImagePath[MAX_PATH];
	TCHAR		pszFullPath[MAX_PATH];
	HANDLE		hProcess;
	if(!pszFullPath)
		return FALSE;

	pszFullPath[0] = '\0';
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
	if(!hProcess)
		return FALSE;

	if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))
	{
		CloseHandle(hProcess);
		return FALSE;
	}

	if(!DosPathToNtPath(szImagePath, pszFullPath))
	{
		CloseHandle(hProcess);
		return FALSE;
	}

	CloseHandle(hProcess);

	_tprintf(_T("%d,%s \r\n"),dwPID,pszFullPath);
	return TRUE;
}
int main(int argc, char* argv[])
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (INVALID_HANDLE_VALUE == hSnapshot)
	{
		return NULL;
	}
	PROCESSENTRY32 pe ={0};
	pe.dwSize = sizeof(PROCESSENTRY32); 

	BOOL fOk;
	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
	{
		GetProcessFullPath(pe.th32ProcessID);
		//ShowModule(pe.th32ProcessID,pe.szExeFile); //仅32位
	}
	return 0;
}

仅在32位系统的也可以调用:

void ShowModule(DWORD PID,char *strExePath)
{
	HANDLE hSnapShot;
	BOOL fOk;
	hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
	MODULEENTRY32 me={sizeof(me)};
	for(fOk=Module32First(hSnapShot,&me);fOk;fOk=Module32Next(hSnapShot,&me))
	{
		if (strstr(me.szExePath,strExePath) != NULL)
		{
			printf("%s \r\n",me.szExePath);
		}
	}
}


 
 

参考: http://blog.csdn.net/dongpanshan/article/details/18410203




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值