2013-01-10 25 views
1

我下載了這個類http://www.codeproject.com/file/VersionInfo.aspC++的VisualStudio GetFileVersionInfo

我用它來得到我目前運行幾個程序的文件信息。

它工作正常,當我想從我寫的程序中獲取信息時,但我無法獲得「chrome」或我的「visual studio」的文件信息。

當我詢問我的應用程序的產品名稱,我得到

「TODO:產品名稱」,因爲它並沒有被設定;)

但是當我查詢的chrome.exe的產品名稱,我只是得到「」沒什麼。

有沒有人知道爲什麼?

編輯:我調試了一下,問題在這裏。

BOOL CFileVersionInfo::Open(IN LPCTSTR lpszFileName) 
{ 
if(lpszFileName == NULL) 
    ASSERT_RETURN(FALSE); 

Close(); 
if(!GetVersionInfo(lpszFileName) || !QueryVersionTrans()) 
    Close(); 

return m_bValid; 
}; 

的GetVersionInfo(lpsz ...)並返回0;如果 「的chrome.exe」 進入

編輯2: 是的chrome.exe有一個產品名稱字段。

例如:的chrome.exe - 文件描述:谷歌瀏覽器 - 類型:Application - 文件版本:23.0.1271.97 - 產品名稱:谷歌瀏覽器 - 產品版本:23.0.1271.97 - 版權所有:..布拉布拉...... - 大小:1.18MB - 修改日期:some_date - 語言:英語 - 原始文件名:的chrome.exe

編輯3: 我怎樣才能獲得的完整路徑的exe?我只有進程ID。此刻,iam遍歷所有進程並搜索我的processId。

感謝迄今爲您解答:-)

+0

你不應該使用的完整路徑的chrome.exe? – stijn

回答

2

我怎樣才能獲得完整路徑exe文件?

使用OpenProcess()獲得HANDLE的過程,然後用QueryFullProcessImageName()獲得EXE文件的完整路徑。

記得檢查GetLastError()的結果以確定失敗的原因。

+0

這就是解決方案。謝謝;) – Laokoon

+0

應該指出,'QueryFullProcessImageName()'只適用於Windows Vista及更高版本。如果您使用的是Windows XP,則必須將[GetModuleFileNameEx()](https://msdn.microsoft.com/en-us/library/ms683198(VS.85).aspx)與[EnumProcessModules()] (https://msdn.microsoft.com/en-gb/library/windows/desktop/ms682631(v=vs.85).aspx)來檢索完整的文件路徑。 – Vinzenz

1

這工作正常,我

#include <windows.h> 
#include <vector> 
#include <string> 
#pragma comment(lib, "Version.lib") 

std::string processId_2_version(int processId) 
{ 
    HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, processId); 
    if (h == 0) 
    { 
     return ""; 
    } 
    char exe[ 1024 ]; 
    DWORD exe_size = 1024; 
    QueryFullProcessImageNameA(h, 0, exe, & exe_size); 
    CloseHandle(h); 
    DWORD dwHandle, sz = GetFileVersionInfoSizeA(exe, & dwHandle); 
    if (0 == sz) 
    { 
     return ""; 
    } 
    std::vector< unsigned char > buf(sz); 
    if (!GetFileVersionInfoA(exe, dwHandle, sz, & buf[ 0 ])) 
    { 
     return ""; 
    } 
    VS_FIXEDFILEINFO * pvi; 
    sz = sizeof(VS_FIXEDFILEINFO); 
    if (!VerQueryValueA(& buf[ 0 ], "\\", (LPVOID*)&pvi, (unsigned int*)&sz)) 
    { 
     return ""; 
    } 
    char ver[ 142 ]; 
    sprintf(ver, "%d.%d.%d.%d" 
      , pvi->dwProductVersionMS >> 16 
      , pvi->dwFileVersionMS & 0xFFFF 
      , pvi->dwFileVersionLS >> 16 
      , pvi->dwFileVersionLS & 0xFFFF 
      ); 
    return ver; 
}