28. FAQ o Win API

Q> How to derive version EXE, DLL etc.? 
A> 

void GetVersionOfFile (char * pszAppName,//file 
                       char * pszVerBuff,//receives version 
                       int iVerBuffLen,//size of buffer 
                       char * pszLangBuff,//receives language 
                       int iLangBuffLen)//size of buffer 
{ 
   DWORD dwScratch; 
   DWORD * pdwLangChar; 
   DWORD dwInfSize; 
   UINT uSize; 
   BYTE * pbyInfBuff; 
   char szVersion [32]; 
   char szResource [80]; 
   char * pszVersion = szVersion; 

   dwInfSize = GetFileVersionInfoSize (pszAppName, &dwScratch); 

   if (dwInfSize) 
   { 
      pbyInfBuff = new BYTE [dwInfSize]; 
      memset (pbyInfBuff, 0, dwInfSize); 
      if (pbyInfBuff) 
      { 
         if (GetFileVersionInfo (pszAppName, 0, dwInfSize, pbyInfBuff)) 
         { 
            if (VerQueryValue (pbyInfBuff, 
                               "\\VarFileInfo \\Translation", 
                               (void **) (&pdwLangChar), 
                               &uSize)) 
            { 
               if (VerLanguageName (LOWORD (*pdwLangChar), 
                                    szResource, 
                                    sizeof (szResource))) 
               { 
                  strncpy (pszLangBuff, szResource, iLangBuffLen); 
               }
               wsprintf (szResource, "\\StringFileInfo \\%04X%04X \\FileVersion", 
                         LOWORD (*pdwLangChar), HIWORD (*pdwLangChar)); 

               if (VerQueryValue (pbyInfBuff, 
                                  szResource, 
                                  (void **) (&pszVersion), 
                                  &uSize)) 
               { 
                  strncpy (pszVerBuff, pszVersion, iVerBuffLen-1); 
               }
            }
         }
         delete [] pbyInfBuff; 
      }
   }
}

2000 (c) DM