之前在msdn上Version Information看到文件版本信息的介绍,看着整体比较复杂,就一直没做。现在需要获取ocx文件的版本号,所以查找了下相关资料,比较有用的就是VS_FIXEDFILEINFO结构,获取这个参数就基本可以完成任务了。
代码如下:
//typedef struct tagVS_FIXEDFILEINFO
//{
// DWORD dwSignature; /* e.g. 0xfeef04bd */
// DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */
// DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */
// DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */
// DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */
// DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */
// DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */
// DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */
// DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */
// DWORD dwFileType; /* e.g. VFT_DRIVER */
// DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */
// DWORD dwFileDateMS; /* e.g. 0 */
// DWORD dwFileDateLS; /* e.g. 0 */
//} VS_FIXEDFILEINFO;
{
char szAppFullPath[_MAX_PATH] = {}; GetModuleFileName(NULL,szAppFullPath,MAX_PATH);//得到程序模块名称,全路径 //获取当前文件的版本信息
DWORD dwLen = GetFileVersionInfoSize(szAppFullPath,NULL);
char *pszAppVersion = new char[dwLen+];
if(pszAppVersion)
{
memset(pszAppVersion,,sizeof(char)*(dwLen+));
GetFileVersionInfo(szAppFullPath,NULL,dwLen,pszAppVersion);
CString strVersion;
UINT nLen();
VS_FIXEDFILEINFO *pFileInfo(NULL);
VerQueryValue(pszAppVersion,"\\",(LPVOID*)&pFileInfo,&nLen);
if(pFileInfo)
{
//获取文件版本号
strVersion.Format("%d.%d.%d.%d",HIWORD(pFileInfo->dwFileVersionMS),
LOWORD(pFileInfo->dwFileVersionMS),
HIWORD(pFileInfo->dwFileVersionLS),
LOWORD(pFileInfo->dwFileVersionLS));
}
}
}
基本思路就是先获取可执行文件所在的全路径,然后使用GetFileVersionInfo函数,获取版本信息;之后使用VerQueryValue函数,查询版本信息。