利用GetModuleFileName在32位机器上开发的程序,在64位机器上运行的时候,GetModuleFileName和GetModuleFileNameEX获取信息失败。
解决64位机器获取失败的这个问题,有两个方法
1.用64位机器开发64位的程序,用GetModuleFileNameEX方法。
2.用 QueryFullProcessImageName
(Vista and up) or GetProcessImageFileName (XP and up)。
GetProcessImageFileName可以在xp和win732位和64位都能获取进程路径,GetModuleFileNameEx只能获取32位进程路径
但GetProcessImageFileName获取的路径都是包含设备名的路径,因此我们还要转换成一下,因此我们最终的GetProcessFullPath函数这样的
- //获取进程完整路径
- BOOL GetProcessFullPath(DWORD dwPID, TCHAR pszFullPath[MAX_PATH])
- {
- TCHAR szImagePath[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);
- return TRUE;
- }
- 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;
- }
参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx