|
如何在VC2008中编程实现获取程序的版本号? // 取进程版本号码 // 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; }
|