Bob Moore's Coding Tips

3. How do I extract the version of an EXE or DLL?

I make no promises as to quality, but it _does_ work. All error handling and
parameter validation has been removed for brevity.

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];

      if (pbyInfBuff)
      {
         ZeroMemory (pbyInfBuff, dwInfSize);

         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;
      }
   }
}