win32获取文件版本信息

来源:互联网 发布:数据擦除机 编辑:程序博客网 时间:2024/05/21 09:49

1.使用GetFileVersionInfoSize函数获取版本信息大小

DWORD GetFileVersionInfoSize(          LPCTSTR lptstrFilename,    LPDWORD lpdwHandle);
2.GetFileVersionInfo获取版本信息,需要先声明一个缓冲,大小为GetFileVersionInfoSize

BOOL GetFileVersionInfo(          LPCTSTR lptstrFilename,    DWORD dwHandle,    DWORD dwLen,    LPVOID lpData);

3.VerQueryValue获取语言和字符集信息

BOOL VerQueryValue(          LPCVOID pBlock,    LPCTSTR lpSubBlock,    LPVOID *lplpBuffer,    PUINT puLen);
其中,lpSubBlock为"\\VarFileInfo\\Translation"

返回的是一个WORD数组,存放在lplpBuffer


4.解析WORD组,获取对应的LANG和CODEPAGE

5.根据LANG和CODEPAGE对,查询对应的版本信息的具体内容

具体内容包括


比如查到的LANGUAGE为0, codepage为1200

那么本次查询对应文件版本的方法为调用VerQueryValue,lpSubBlock为"\\StringFileInfo\\00001200\\ProductVersion",返回的版本信息在lplpBuffer中。


具体的代码如下:

if(szFileOrgName != NULL && strlen(szFileOrgName) != 0 && (strcmp(szFileOrgName, "iexplore.exe") == 0 || strcmp(szFileOrgName, "IEEXPLORE.EXE") == 0))
{
#ifdef _DEBUG
MessageBox(NULL, "是IE浏览器", "提示", MB_OK);
#endif
DWORD dwHandle = 0;
DWORD dwSize = GetFileVersionInfoSize((LPCTSTR)szBrowserFileInfo, &dwHandle);
if(dwSize != 0)
{
char* szFileVersionInfo = new char[dwSize];
memset(szFileVersionInfo, 0, dwSize);
if(GetFileVersionInfo(szBrowserFileInfo, 0, dwSize, szFileVersionInfo) != 0)
{
UINT nVersionLength = 0;
DWORD* lpszVersion = NULL;
if(VerQueryValue(szFileVersionInfo, TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&lpszVersion, &nVersionLength) != 0)
{
if(nVersionLength >= 4)
{
char* szProductVersion = NULL;
char* szSubBlock = new char[256];
UINT dwReadBtyes = 0;
memset(szSubBlock, 0, 256);
DWORD dwLangAndCodePage = (*lpszVersion);
WORD dwLang = (WORD)dwLangAndCodePage;
WORD dwCodePage = dwLangAndCodePage>>(sizeof(WORD)*8);
if(sprintf(szSubBlock, "\\StringFileInfo\\%04x%04x\\ProductVersion", dwLang, dwCodePage) > 0)
{
VerQueryValue(szFileVersionInfo, szSubBlock, (LPVOID*)&szProductVersion, (PUINT)&dwReadBtyes);
}
if(strstr(szProductVersion, "."))
{
int nFirstVersionLength = strstr(szProductVersion, ".") - szProductVersion;
if(nFirstVersionLength > 0)
{
char* sz = new char[2];
char* szFirstVersion = new char[nFirstVersionLength + 1];
memset(szFirstVersion, 0, nFirstVersionLength + 1);
memcpy(szFirstVersion, szProductVersion,nFirstVersionLength);
if(strlen(szFirstVersion) > 0 && strcmp(szFirstVersion, "6") == 0)
bIsIE6 = true;
delete szFirstVersion;
}
}
delete szSubBlock;
}
}
}
delete szFileVersionInfo;
}
}

0 0
原创粉丝点击