getver.c
上传用户:chzmdj
上传日期:2007-01-22
资源大小:135k
文件大小:3k
源码类别:

源码/资料

开发平台:

C/C++

  1. #include <windows.h>
  2. #include <limits.h>
  3. #include "GetVer.h"
  4. BOOL GetProgramVersion(LPTSTR szFileName,
  5.                        int nVersionMin[3],
  6.                        int nVersionMax[3],
  7.                        DWORD dwLangId
  8.                        )
  9. {
  10.         DWORD dwZero, dwVerInfoSize;
  11.         LPVOID lpData;
  12.         LPVOID lpBuffer;
  13.         UINT uBytes;
  14.         VS_FIXEDFILEINFO *pVsFixedFileInfo;
  15.         INT nVersionNums[3], i;
  16.         WORD* pdwLangIds;
  17.         BOOL boolIsLangSupported = FALSE;
  18.         if(szFileName == NULL)
  19.                 return FALSE;
  20.         dwVerInfoSize = GetFileVersionInfoSize(szFileName, &dwZero);
  21.         if(!dwVerInfoSize)
  22.                 return FALSE;
  23.         
  24.         lpData = HeapAlloc(GetProcessHeap(), 0, dwVerInfoSize);
  25.         if(!lpData)
  26.                 return FALSE;
  27.         __try {
  28.                 if(!GetFileVersionInfo(szFileName, 0, dwVerInfoSize, lpData))
  29.                         return FALSE;
  30.                 if(!VerQueryValue(lpData, "\", &lpBuffer, &uBytes))
  31.                         return FALSE;
  32.                 if( uBytes == 0 )
  33.                         return FALSE;
  34.                 
  35.                 pVsFixedFileInfo = (VS_FIXEDFILEINFO *)lpBuffer;
  36.                 nVersionNums[0] = HIWORD(pVsFixedFileInfo-> dwFileVersionMS);
  37.                 nVersionNums[1] = LOWORD(pVsFixedFileInfo->dwFileVersionMS);
  38.                 nVersionNums[2] = pVsFixedFileInfo->dwFileVersionLS;
  39.                 if(dwLangId == 0)
  40.                         __leave;
  41.                 if(!VerQueryValue(lpData, "\VarFileInfo\Translation", &lpBuffer, &uBytes))
  42.                         return FALSE;
  43.                 if(uBytes == 0)
  44.                         return FALSE;
  45.                 
  46.                 pdwLangIds = (WORD *)lpBuffer;
  47.                 for(i = 0; i < (INT)(uBytes/sizeof(WORD)); i++)
  48.                 {
  49.                         if(pdwLangIds[i] == dwLangId)
  50.                         {
  51.                                 boolIsLangSupported = TRUE;
  52.                                 break;
  53.                         }
  54.                 }
  55.                 if( !boolIsLangSupported )
  56.                         return FALSE;
  57.         } __finally {
  58.                 if(lpData)
  59.                         HeapFree(GetProcessHeap(), 0, lpData);
  60.         }
  61.         return TRUE;
  62. }
  63. BOOL IsDesiredFileVersion(LPTSTR szFileExeName, DWORD dwLangId)
  64. {
  65.         int vermin[3] = {IE_VERSION_FIRST, IE_VERSION_SECOND, 0},
  66.                         vermax[3] = {IE_VERSION_FIRST, IE_VERSION_SECOND, INT_MAX};
  67.         return GetProgramVersion(szFileExeName, vermin, vermax, dwLangId);
  68. }