// 取进程版本号码
// VC 2008
// (控制台程序的版本资源需要手动插入)
#include "stdafx.h"
#include <windows.h>
#pragma comment(lib, "Version.lib")
DWORD GetVer(WORD& wVer1, WORD& wVer2, WORD& wVer3, WORD& wVer4);
int _tmain(int argc, _TCHAR* argv[])
{
WORD v1, v2, v3, v4;
DWORD dwA = GetVer(v1, v2, v3, v4);
printf("Ver: %d.%d.%d.%d/n", v1, v2, v3, v4);
return 0;
}
// 取进程版本号
DWORD GetVer(WORD& wVer1, WORD& wVer2, WORD& wVer3, WORD& wVer4)
{
wVer1 = 0;
wVer2 = 0;
wVer3 = 0;
wVer4 = 0;
// 进程文件名
TCHAR szPath[MAX_PATH] = {0};
GetModuleFileName(NULL, szPath, MAX_PATH);
if(ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
// 路径太长
return FALSE;
}
// 信息块大小
DWORD dwFileVersionInfoSize = GetFileVersionInfoSize(szPath, NULL);
if(dwFileVersionInfoSize == 0)
{
// 没有版本信息
return FALSE;
}
BYTE lpData[4096] = {0};
if(dwFileVersionInfoSize > sizeof(lpData))
{
// 信息太多
// (建议lpData使用根据dwFileVersionInfoSize动态分配的内存)
return FALSE;
}
// 获取版本信息
if (! GetFileVersionInfo(szPath, NULL, dwFileVersionInfoSize, lpData))
{
return FALSE;
}
// 查询版本号信息
UINT unInfoLen = 0;
VS_FIXEDFILEINFO* vsFileInfo = 0;
if (! VerQueryValue(lpData, _T("//"), (LPVOID*)&vsFileInfo, &unInfoLen))
{
return FALSE;
}
if (unInfoLen != sizeof(VS_FIXEDFILEINFO))
{
return FALSE;
}
// 版本信息 a.b.c.d
wVer1 = HIWORD(vsFileInfo->dwFileVersionMS);
wVer2 = LOWORD(vsFileInfo->dwFileVersionMS);
wVer3 = HIWORD(vsFileInfo->dwFileVersionLS);
wVer4 = LOWORD(vsFileInfo->dwFileVersionLS);
return TRUE;
}