我下载了这个类http://www.codeproject.com/file/VersionInfo.asp
我用它从我当前运行的几个程序中获取文件信息。
当我想从我写的程序中获取信息时,它工作得很好,但我无法获得"chrome"或我的"visual studio"的文件信息。
当我查询应用程序的productName时,我得到"Todo: productName",因为它还没有设置;)
但是当我查询chrome.exe的productName时,我只是得到" nothing.
有人知道为什么吗?
编辑:我调试了一下,问题在这里。
BOOL CFileVersionInfo::Open( IN LPCTSTR lpszFileName )
{
if( lpszFileName == NULL )
ASSERT_RETURN( FALSE );
Close();
if( !GetVersionInfo( lpszFileName ) || !QueryVersionTrans() )
Close();
return m_bValid;
};
GetVersionInfo(lpsz…)当输入"chrome.exe"时返回0
编辑2:是chrome.exe有一个产品名称字段。
例子:chrome.exe—文件说明:"Google Chrome"-类型:应用—文件版本号:23.0.1271.97—产品名称:Google Chrome—产品版本号:23.0.1271.97-版权:…blabla…-大小:1.18MB—修改日期:some_date-语言:英语-原始文件名:chrome.exe
编辑3:如何获得exe的完整路径?我只有进程ID。目前我正在遍历所有进程并搜索我的processId。
谢谢你的回答:-)
如何获得exe的完整路径?
使用OpenProcess()获取进程的HANDLE
,然后使用QueryFullProcessImageName()获取exe的完整路径。
记住检查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;
}