C++ VisualStudio GetFileVersionInfo

Я скачал этот класс http://www.codeproject.com/file/VersionInfo.asp

Я использую его, чтобы получить информацию о файлах из нескольких программ, которые я сейчас запускаю.

Он отлично работает, когда я хочу получить информацию из программы, которую я написал, но я не могу получить информацию о файле "chrome" или моей "визуальной студии", например.

когда я запрашиваю productName моего приложения, я получаю "Todo:ProductName", потому что он еще не установлен;)

но когда я запрашиваю productName 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 - Описание файла: Google Chrome - Тип: Приложение - Версия файла: 23.0.1271.97 - NAme продукта: Google Chrome - Версия продукта: 23.0.1271.97 - Авторское право: ..blabla... - Размер: 1.18MB - Дата изменения: some_date - Язык: Английский - Исходное имя файла: chrome.exe

Редактировать 3: Как я могу получить полный путь к exe? У меня просто есть идентификатор процесса. На данный момент я перебираю все процессы и ищу мой processId.

Спасибо за ваши ответы:-)

2 ответа

Решение

Как я могу получить полный путь к exe?

Используйте OpenProcess(), чтобы получить HANDLE к процессу, а затем используйте QueryFullProcessImageName(), чтобы получить полный путь к исполняемому файлу.

Не забудьте проверить результат GetLastError() определить причину отказа.

Это прекрасно работает для меня

#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;
}
Другие вопросы по тегам