获得文件版本等信息
2011-05-19 13:52
309 查看
#pragma comment(lib, "version.lib")
DWORD QueryFileInfo(LPTSTR szFullPath)
{
DWORD dwErr = ERROR_SUCCESS;
DWORD dwVerHnd=0; // An 'ignored' parameter, always '0'
DWORD dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);
if (dwVerInfoSize)
{
LPBYTE lpVfInfo = new BYTE[dwVerInfoSize];
ZeroMemory(lpVfInfo, dwVerInfoSize);
if(GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpVfInfo))
{
UINT uVerLen;
TCHAR dbgStr[1024] = {0};
//Specifies the root block.
//The function retrieves a pointer to the VS_FIXEDFILEINFO structure
// for the version-information resource.
VS_FIXEDFILEINFO *pFixedVfInfo = 0;
if(VerQueryValue(lpVfInfo, _T("//"), (LPVOID*)&pFixedVfInfo, &uVerLen))
{
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwSignature = %08XH/r/n"),
pFixedVfInfo->dwSignature);
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwStrucVersion = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwStrucVersion), //major version number
LOWORD(pFixedVfInfo->dwStrucVersion)); //minor version number
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionMS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwFileVersionMS),
LOWORD(pFixedVfInfo->dwFileVersionMS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionLS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwFileVersionLS),
LOWORD(pFixedVfInfo->dwFileVersionLS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionMS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwProductVersionMS),
LOWORD(pFixedVfInfo->dwProductVersionMS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionLS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwProductVersionLS),
LOWORD(pFixedVfInfo->dwProductVersionLS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlagsMask = 0x%X/r/n"),
pFixedVfInfo->dwFileFlagsMask);
OutputDebugString(dbgStr);
#define FileFlageCheck(x) { if(pFixedVfInfo->dwFileFlags & (x)) _tcscat(dbgStr, #x" | "); }
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlags = 0x%X =>"),
pFixedVfInfo->dwFileFlagsMask & pFixedVfInfo->dwFileFlags);
FileFlageCheck(VS_FF_DEBUG);
FileFlageCheck(VS_FF_PRERELEASE);
FileFlageCheck(VS_FF_PATCHED);
FileFlageCheck(VS_FF_PRIVATEBUILD);
FileFlageCheck(VS_FF_INFOINFERRED);
FileFlageCheck(VS_FF_SPECIALBUILD);
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
#define IsOsVersion(x) { if(pFixedVfInfo->dwFileOS == (x)) _tcscat(dbgStr, #x); }
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileOS = "));
IsOsVersion(VOS_NT_WINDOWS32);
IsOsVersion(VOS_OS232_PM32);
IsOsVersion(VOS_OS216_PM16);
IsOsVersion(VOS_DOS_WINDOWS32);
IsOsVersion(VOS_DOS_WINDOWS16);
IsOsVersion(VOS__WINDOWS32);
IsOsVersion(VOS__PM32);
IsOsVersion(VOS__PM16);
IsOsVersion(VOS__WINDOWS16);
IsOsVersion(VOS__BASE);
IsOsVersion(VOS_NT);
IsOsVersion(VOS_OS232);
IsOsVersion(VOS_OS216);
IsOsVersion(VOS_DOS);
IsOsVersion(VOS_UNKNOWN);
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
#define IsFileType(x) { if(pFixedVfInfo->dwFileType == (x)) _tcscat(dbgStr, #x); }
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileType = "));
IsFileType( VFT_UNKNOWN );
IsFileType( VFT_APP );
IsFileType( VFT_DLL );
IsFileType( VFT_DRV );
IsFileType( VFT_FONT );
IsFileType( VFT_VXD );
IsFileType( VFT_STATIC_LIB );
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileSubtype = "));
if(pFixedVfInfo->dwFileType == VFT_DRV)
{
IsFileType( VFT2_UNKNOWN );
IsFileType( VFT2_DRV_PRINTER );
IsFileType( VFT2_DRV_KEYBOARD );
IsFileType( VFT2_DRV_LANGUAGE );
IsFileType( VFT2_DRV_DISPLAY );
IsFileType( VFT2_DRV_MOUSE );
IsFileType( VFT2_DRV_NETWORK );
IsFileType( VFT2_DRV_SYSTEM );
IsFileType( VFT2_DRV_INSTALLABLE );
IsFileType( VFT2_DRV_SOUND );
IsFileType( VFT2_DRV_COMM );
IsFileType( VFT2_DRV_INPUTMETHOD );
}
else if(pFixedVfInfo->dwFileType == VFT_FONT)
{
IsFileType( VFT2_FONT_RASTER );
IsFileType( VFT2_FONT_VECTOR );
IsFileType( VFT2_FONT_TRUETYPE );
}
else if(pFixedVfInfo->dwFileType == VFT_VXD )
{
_tcscat(dbgStr, _T("virtual device control block"));
}
else
{
_tcscat(dbgStr, _T("VFT2_UNKNOWN"));
}
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateMS = %d/r/n"),
pFixedVfInfo->dwFileDateMS);
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateLS = %d/r/n"),
pFixedVfInfo->dwFileDateLS);
OutputDebugString(dbgStr);
}
//first two bytes are language id, and last two bytes are code page
TCHAR Lang_Charset[10] = {0};
LPWORD pLangPageCode = 0;
if(VerQueryValue(lpVfInfo, _T("//VarFileInfo//Translation"), (LPVOID*)&pLangPageCode, &uVerLen))
{
_stprintf(Lang_Charset, _T("%04X%04X"), pLangPageCode[0], /*LANG SUBLANG*/ pLangPageCode[1]/*Codepage*/);
_stprintf(dbgStr, _T("LangPageCode=%s/r/n"), Lang_Charset);
OutputDebugString(dbgStr);
}
//
LPCTSTR subStrName[] =
{
_T("CompanyName"),
_T("FileDescription"),
_T("FileVersion"),
_T("InternalName"),
_T("LegalCopyright"),
_T("OriginalFileName"),
_T("ProductName"),
_T("ProductVersion"),
};
for(int i=0; i<sizeof(subStrName)/sizeof(subStrName[0]); i++)
{
TCHAR szsubBlock[256] = {0}; ///StringFileInfo/lang-codepage/string-name
_stprintf(szsubBlock, _T("//StringFileInfo//%s//%s"), Lang_Charset, subStrName[i]);
//The function retrieves a string value specific to the language and code page indicated.
LPTSTR lpszInfo = NULL;
if(VerQueryValue(lpVfInfo, szsubBlock, (LPVOID*)&lpszInfo, &uVerLen))
{
_stprintf(dbgStr, _T("%s->%s/r/n"),subStrName[i], lpszInfo);
OutputDebugString(dbgStr);
}
}
}
else
{
dwErr = GetLastError();
}
delete []lpVfInfo;
}
else //GetFileVersionInfoSize Error;
{
dwErr = GetLastError();
}
return dwErr;
}
DWORD QueryFileInfo(LPTSTR szFullPath)
{
DWORD dwErr = ERROR_SUCCESS;
DWORD dwVerHnd=0; // An 'ignored' parameter, always '0'
DWORD dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);
if (dwVerInfoSize)
{
LPBYTE lpVfInfo = new BYTE[dwVerInfoSize];
ZeroMemory(lpVfInfo, dwVerInfoSize);
if(GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpVfInfo))
{
UINT uVerLen;
TCHAR dbgStr[1024] = {0};
//Specifies the root block.
//The function retrieves a pointer to the VS_FIXEDFILEINFO structure
// for the version-information resource.
VS_FIXEDFILEINFO *pFixedVfInfo = 0;
if(VerQueryValue(lpVfInfo, _T("//"), (LPVOID*)&pFixedVfInfo, &uVerLen))
{
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwSignature = %08XH/r/n"),
pFixedVfInfo->dwSignature);
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwStrucVersion = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwStrucVersion), //major version number
LOWORD(pFixedVfInfo->dwStrucVersion)); //minor version number
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionMS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwFileVersionMS),
LOWORD(pFixedVfInfo->dwFileVersionMS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionLS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwFileVersionLS),
LOWORD(pFixedVfInfo->dwFileVersionLS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionMS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwProductVersionMS),
LOWORD(pFixedVfInfo->dwProductVersionMS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionLS = %X.%X/r/n"),
HIWORD(pFixedVfInfo->dwProductVersionLS),
LOWORD(pFixedVfInfo->dwProductVersionLS));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlagsMask = 0x%X/r/n"),
pFixedVfInfo->dwFileFlagsMask);
OutputDebugString(dbgStr);
#define FileFlageCheck(x) { if(pFixedVfInfo->dwFileFlags & (x)) _tcscat(dbgStr, #x" | "); }
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlags = 0x%X =>"),
pFixedVfInfo->dwFileFlagsMask & pFixedVfInfo->dwFileFlags);
FileFlageCheck(VS_FF_DEBUG);
FileFlageCheck(VS_FF_PRERELEASE);
FileFlageCheck(VS_FF_PATCHED);
FileFlageCheck(VS_FF_PRIVATEBUILD);
FileFlageCheck(VS_FF_INFOINFERRED);
FileFlageCheck(VS_FF_SPECIALBUILD);
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
#define IsOsVersion(x) { if(pFixedVfInfo->dwFileOS == (x)) _tcscat(dbgStr, #x); }
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileOS = "));
IsOsVersion(VOS_NT_WINDOWS32);
IsOsVersion(VOS_OS232_PM32);
IsOsVersion(VOS_OS216_PM16);
IsOsVersion(VOS_DOS_WINDOWS32);
IsOsVersion(VOS_DOS_WINDOWS16);
IsOsVersion(VOS__WINDOWS32);
IsOsVersion(VOS__PM32);
IsOsVersion(VOS__PM16);
IsOsVersion(VOS__WINDOWS16);
IsOsVersion(VOS__BASE);
IsOsVersion(VOS_NT);
IsOsVersion(VOS_OS232);
IsOsVersion(VOS_OS216);
IsOsVersion(VOS_DOS);
IsOsVersion(VOS_UNKNOWN);
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
#define IsFileType(x) { if(pFixedVfInfo->dwFileType == (x)) _tcscat(dbgStr, #x); }
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileType = "));
IsFileType( VFT_UNKNOWN );
IsFileType( VFT_APP );
IsFileType( VFT_DLL );
IsFileType( VFT_DRV );
IsFileType( VFT_FONT );
IsFileType( VFT_VXD );
IsFileType( VFT_STATIC_LIB );
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileSubtype = "));
if(pFixedVfInfo->dwFileType == VFT_DRV)
{
IsFileType( VFT2_UNKNOWN );
IsFileType( VFT2_DRV_PRINTER );
IsFileType( VFT2_DRV_KEYBOARD );
IsFileType( VFT2_DRV_LANGUAGE );
IsFileType( VFT2_DRV_DISPLAY );
IsFileType( VFT2_DRV_MOUSE );
IsFileType( VFT2_DRV_NETWORK );
IsFileType( VFT2_DRV_SYSTEM );
IsFileType( VFT2_DRV_INSTALLABLE );
IsFileType( VFT2_DRV_SOUND );
IsFileType( VFT2_DRV_COMM );
IsFileType( VFT2_DRV_INPUTMETHOD );
}
else if(pFixedVfInfo->dwFileType == VFT_FONT)
{
IsFileType( VFT2_FONT_RASTER );
IsFileType( VFT2_FONT_VECTOR );
IsFileType( VFT2_FONT_TRUETYPE );
}
else if(pFixedVfInfo->dwFileType == VFT_VXD )
{
_tcscat(dbgStr, _T("virtual device control block"));
}
else
{
_tcscat(dbgStr, _T("VFT2_UNKNOWN"));
}
_tcscat(dbgStr, _T("/r/n"));
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateMS = %d/r/n"),
pFixedVfInfo->dwFileDateMS);
OutputDebugString(dbgStr);
_stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateLS = %d/r/n"),
pFixedVfInfo->dwFileDateLS);
OutputDebugString(dbgStr);
}
//first two bytes are language id, and last two bytes are code page
TCHAR Lang_Charset[10] = {0};
LPWORD pLangPageCode = 0;
if(VerQueryValue(lpVfInfo, _T("//VarFileInfo//Translation"), (LPVOID*)&pLangPageCode, &uVerLen))
{
_stprintf(Lang_Charset, _T("%04X%04X"), pLangPageCode[0], /*LANG SUBLANG*/ pLangPageCode[1]/*Codepage*/);
_stprintf(dbgStr, _T("LangPageCode=%s/r/n"), Lang_Charset);
OutputDebugString(dbgStr);
}
//
LPCTSTR subStrName[] =
{
_T("CompanyName"),
_T("FileDescription"),
_T("FileVersion"),
_T("InternalName"),
_T("LegalCopyright"),
_T("OriginalFileName"),
_T("ProductName"),
_T("ProductVersion"),
};
for(int i=0; i<sizeof(subStrName)/sizeof(subStrName[0]); i++)
{
TCHAR szsubBlock[256] = {0}; ///StringFileInfo/lang-codepage/string-name
_stprintf(szsubBlock, _T("//StringFileInfo//%s//%s"), Lang_Charset, subStrName[i]);
//The function retrieves a string value specific to the language and code page indicated.
LPTSTR lpszInfo = NULL;
if(VerQueryValue(lpVfInfo, szsubBlock, (LPVOID*)&lpszInfo, &uVerLen))
{
_stprintf(dbgStr, _T("%s->%s/r/n"),subStrName[i], lpszInfo);
OutputDebugString(dbgStr);
}
}
}
else
{
dwErr = GetLastError();
}
delete []lpVfInfo;
}
else //GetFileVersionInfoSize Error;
{
dwErr = GetLastError();
}
return dwErr;
}
相关文章推荐
- C#:获得文件版本信息及只读文件的删除
- 获得文件版本信息
- C#:获得文件版本信息及只读文件的删除
- QT用API获得文件的版本信息
- vc下获得文件版本信息
- QT用API获得文件的版本信息
- 获得文件版本信息
- QT用API获得文件的版本信息
- C#获得文件版本信息及只读文件的删除
- C#获得文件版本信息及只读文件的删除
- C# 获得程序集版本信息,文件修改日期,最后修改日期的类,IList 排序类
- 从资源文件中获取版本信息
- 对一个apk文件获取相应的版本信息和其他信息
- win32api 获取文件版本信息
- Java中如何获得文件的inode信息
- 如何查看.mdf文件数据库版本信息
- 根据.MDF文件查看 SQL数据库的版本信息
- 在Windows Mobile 中利用 WebRequest 下载文件并获得响应头的信息信息
- 修改文件版本信息(PE文件版本信息、资源Version)
- 获取UWP配置文件中的版本信息