getver.c

来自「屏幕取词源码.zip」· C语言 代码 · 共 84 行

C
84
字号
#include <windows.h>
#include <limits.h>

#include "GetVer.h"

BOOL GetProgramVersion(LPTSTR szFileName,
                       int nVersionMin[3],
                       int nVersionMax[3],
                       DWORD dwLangId
                       )
{
        DWORD dwZero, dwVerInfoSize;
        LPVOID lpData;
        LPVOID lpBuffer;
        UINT uBytes;
        VS_FIXEDFILEINFO *pVsFixedFileInfo;
        INT nVersionNums[3], i;
        WORD* pdwLangIds;
        BOOL boolIsLangSupported = FALSE;

        if(szFileName == NULL)
                return FALSE;

        dwVerInfoSize = GetFileVersionInfoSize(szFileName, &dwZero);
        if(!dwVerInfoSize)
                return FALSE;
        
        lpData = HeapAlloc(GetProcessHeap(), 0, dwVerInfoSize);
        if(!lpData)
                return FALSE;
        __try {
                if(!GetFileVersionInfo(szFileName, 0, dwVerInfoSize, lpData))
                        return FALSE;

                if(!VerQueryValue(lpData, "\\", &lpBuffer, &uBytes))
                        return FALSE;

                if( uBytes == 0 )
                        return FALSE;
                
                pVsFixedFileInfo = (VS_FIXEDFILEINFO *)lpBuffer;
                nVersionNums[0] = HIWORD(pVsFixedFileInfo-> dwFileVersionMS);
                nVersionNums[1] = LOWORD(pVsFixedFileInfo->dwFileVersionMS);
                nVersionNums[2] = pVsFixedFileInfo->dwFileVersionLS;

                if(dwLangId == 0)
                        __leave;

                if(!VerQueryValue(lpData, "\\VarFileInfo\\Translation", &lpBuffer, &uBytes))
                        return FALSE;

                if(uBytes == 0)
                        return FALSE;
                
                pdwLangIds = (WORD *)lpBuffer;

                for(i = 0; i < (INT)(uBytes/sizeof(WORD)); i++)
                {
                        if(pdwLangIds[i] == dwLangId)
                        {
                                boolIsLangSupported = TRUE;
                                break;
                        }
                }

                if( !boolIsLangSupported )
                        return FALSE;

        } __finally {
                if(lpData)
                        HeapFree(GetProcessHeap(), 0, lpData);
        }

        return TRUE;
}

BOOL IsDesiredFileVersion(LPTSTR szFileExeName, DWORD dwLangId)
{
        int vermin[3] = {IE_VERSION_FIRST, IE_VERSION_SECOND, 0},
                        vermax[3] = {IE_VERSION_FIRST, IE_VERSION_SECOND, INT_MAX};
        return GetProgramVersion(szFileExeName, vermin, vermax, dwLangId);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?