您的位置:首页 > 其它

获得文件版本等信息

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: