牛骨文教育服务平台(让学习变的简单)
博文笔记

win32获取文件版本信息

创建时间:2014-08-22 投稿人: 浏览次数:1519

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;
}
}

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。