利用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))
-
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
GetModuleFileName 64位问题
原文:http://blog.csdn.net/dongpanshan/article/details/18410203