GetModuleFileName 64位问题

来源:互联网 发布:豆瓣 推荐算法 编辑:程序博客网 时间:2024/06/06 05:26

利用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函数这样的

  1. //获取进程完整路径  
  2. BOOL GetProcessFullPath(DWORD dwPID, TCHAR pszFullPath[MAX_PATH])  
  3. {  
  4.     TCHAR       szImagePath[MAX_PATH];  
  5.     HANDLE      hProcess;  
  6.       
  7.     if(!pszFullPath)  
  8.         return FALSE;  
  9.       
  10.     pszFullPath[0] = '\0';  
  11.     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);  
  12.     if(!hProcess)  
  13.         return FALSE;  
  14.   
  15.     if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))  
  16.     {  
  17.         CloseHandle(hProcess);  
  18.         return FALSE;  
  19.     }  
  20.   
  21.     if(!DosPathToNtPath(szImagePath, pszFullPath))  
  22.     {  
  23.         CloseHandle(hProcess);  
  24.         return FALSE;  
  25.     }  
  26.   
  27.     CloseHandle(hProcess);  
  28.   
  29.     return TRUE;  
  30. }  

  1. BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)  
  2. {  
  3.     TCHAR           szDriveStr[500];  
  4.     TCHAR           szDrive[3];  
  5.     TCHAR           szDevName[100];  
  6.     INT             cchDevName;  
  7.     INT             i;  
  8.       
  9.     //检查参数  
  10.     if(!pszDosPath || !pszNtPath )  
  11.         return FALSE;  
  12.   
  13.     //获取本地磁盘字符串  
  14.     if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))  
  15.     {  
  16.         for(i = 0; szDriveStr[i]; i += 4)  
  17.         {  
  18.             if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))  
  19.                 continue;  
  20.   
  21.             szDrive[0] = szDriveStr[i];  
  22.             szDrive[1] = szDriveStr[i + 1];  
  23.             szDrive[2] = '\0';  
  24.             if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备名  
  25.                 return FALSE;  
  26.   
  27.             cchDevName = lstrlen(szDevName);  
  28.             if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中  
  29.             {  
  30.                 lstrcpy(pszNtPath, szDrive);//复制驱动器  
  31.                 lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径  
  32.   
  33.                 return TRUE;  
  34.             }             
  35.         }  
  36.     }  
  37.   
  38.     lstrcpy(pszNtPath, pszDosPath);  
  39.       
  40.     return FALSE;  
  41. }  





参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx
0 0
原创粉丝点击