C ++ VisualStudio GetFileVersionInfo

时间:2013-01-10 09:17:53

标签: c++ winapi mfc getfileversion

我下载了这个课程http://www.codeproject.com/file/VersionInfo.asp

我用它从我目前运行的几个程序中获取文件信息。

当我想从我写的程序中获取信息时它工作正常,但我无法获得“chrome”或我的“visual studio”的文件信息。

当我查询我的应用程序的productName时,我得到“Todo:ProductName”,因为它尚未设置;)

但是当我查询chrome.exe的productName时,我只是“没有”。

有没有人知道为什么?

编辑:我调试了一下,问题就在这里。

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

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

return m_bValid;
};

当输入“chrome.exe”时,GetVersionInfo(lpsz ...)确实返回0

编辑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的完整路径?我只有进程ID。目前,我循环遍历所有进程并搜索我的processId。

到目前为止,感谢您的回答: - )

2 个答案:

答案 0 :(得分:2)

  

如何获得exe的完整路径?

使用OpenProcess()获取HANDLE进程,然后使用QueryFullProcessImageName()获取exe的完整路径。

请务必检查GetLastError()的结果,以确定失败的原因。

答案 1 :(得分: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;
}