PE 포맷 바이너리 파일의 버전을 구하는 함수


와 같이 fileversion을 구하는 함수를 공유합니다.
fileversion은 숫자가 4개로 구성되는데, 각 숫자값을 전달해 줍니다.

  1. // version.lib import  
  2. #include <assert.h>  
  3. #include <winver.h>  
  4.   
  5. DWORD GetVersion(IN LPCTSTR lpszFilePath, OUT PWORD pwVer1, OUT PWORD pwVer2, OUT PWORD pwVer3, OUT PWORD pwVer4)  
  6. {  
  7.     DWORD               dwRtnValue              = ERROR_SUCCESS;  
  8.     DWORD               dwHandle                = 0;  
  9.     DWORD               dwDataSize              = 0;  
  10.     LPBYTE              bufVersionData          = NULL;  
  11.     TCHAR               szValue[MAX_PATH]       = {0,};  
  12.     LPVOID              pData                   = NULL;  
  13.     UINT                nQuerySize              = 0;  
  14.     VS_FIXEDFILEINFO*   pVsffi                  = NULL;  
  15.   
  16.     if ((NULL == lpszFilePath) || (NULL == pwVer1) || (NULL == pwVer2) || (NULL == pwVer3) || (NULL == pwVer4))  
  17.     {  
  18.         dwRtnValue = ERROR_INVALID_PARAMETER;  
  19.         assert(FALSE);  
  20.         goto FINAL;  
  21.     }  
  22.   
  23.     // Clear output  
  24.     *pwVer1 = 0;  
  25.     *pwVer2 = 0;  
  26.     *pwVer3 = 0;  
  27.     *pwVer4 = 0;  
  28.   
  29.     dwDataSize = ::GetFileVersionInfoSize(lpszFilePath, &dwHandle);  
  30.     if (0 == dwDataSize)  
  31.     {  
  32.         dwRtnValue = ::GetLastError();  
  33.         assert(FALSE);  
  34.         goto FINAL;  
  35.     }  
  36.   
  37.     bufVersionData = new BYTE[dwDataSize];  
  38.     if (NULL == bufVersionData)  
  39.     {  
  40.         dwRtnValue = ERROR_NOT_ENOUGH_MEMORY;  
  41.         assert(FALSE);  
  42.         goto FINAL;  
  43.     }  
  44.     ZeroMemory(bufVersionData, sizeof(BYTE)*dwDataSize);  
  45.   
  46.     if (FALSE == ::GetFileVersionInfo(lpszFilePath,   
  47.                                       dwHandle,   
  48.                                       dwDataSize,   
  49.                                       bufVersionData))  
  50.     {  
  51.         dwRtnValue = ::GetLastError();  
  52.         assert(FALSE);  
  53.         goto FINAL;  
  54.     }  
  55.   
  56.     if (FALSE == ::VerQueryValue(bufVersionData,   
  57.                                  TEXT("\\"),   
  58.                                  (LPVOID*)&pVsffi,   
  59.                                  &nQuerySize))  
  60.     {  
  61.         dwRtnValue = ::GetLastError();  
  62.         assert(FALSE);  
  63.         goto FINAL;  
  64.     }  
  65.   
  66.     *pwVer1 = HIWORD(pVsffi->dwFileVersionMS);  
  67.     *pwVer2 = LOWORD(pVsffi->dwFileVersionMS);  
  68.     *pwVer3 = HIWORD(pVsffi->dwFileVersionLS);  
  69.     *pwVer4 = LOWORD(pVsffi->dwFileVersionLS);  
  70.   
  71. FINAL:  
  72.   
  73.     if (NULL != bufVersionData)  
  74.     {  
  75.         delete [] bufVersionData;  
  76.         bufVersionData = NULL;  
  77.     }  
  78.   
  79.     return dwRtnValue;  
  80. }