Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I programmatically get the version of a DLL or EXE file?

I need to get the product version and file version for a DLL or EXE file using Win32 native APIs in C or C++. I'm not looking for the Windows version, but the version numbers that you see by right-clicking on a DLL file, selecting "Properties", then looking at the "Details" tab. This is usually a four-part dotted version number x.x.x.x.

like image 328
JSBձոգչ Avatar asked Jun 02 '09 17:06

JSBձոգչ


People also ask

How do I find a DLL Version?

If you reference the dll in Visual Studio right click it (in ProjectName/References folder) and select "Properties" you have "Version" and "Runtime Version" there. In File Explorer when you right click the dll file and select properties there is a "File Version" and "Product Version" there.

How do I change the DLL Version number?

For a file that is missing version info completely: After opening the DLL in Visual Studio, go to Edit > Add Resource > Version and click New. Then in the new Version tab, change FILEVERSION and PRODUCTVERSION, CompanyName, etc. Save the files and you're all set!

Can a DLL be an executable?

A DLL file is not by it self executable, though it may contain executable code. A DLL (Dynamic-Link Library) contains code, data, resources etc. usable by other programs. You need an EXE file for the operating system to execute code within DLL files, like "RUNDLL.


2 Answers

You would use the GetFileVersionInfo API.

See Using Version Information on the MSDN site.

Sample:

DWORD  verHandle = 0; UINT   size      = 0; LPBYTE lpBuffer  = NULL; DWORD  verSize   = GetFileVersionInfoSize( szVersionFile, &verHandle);  if (verSize != NULL) {     LPSTR verData = new char[verSize];      if (GetFileVersionInfo( szVersionFile, verHandle, verSize, verData))     {         if (VerQueryValue(verData,"\\",(VOID FAR* FAR*)&lpBuffer,&size))         {             if (size)             {                 VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer;                 if (verInfo->dwSignature == 0xfeef04bd)                 {                      // Doesn't matter if you are on 32 bit or 64 bit,                     // DWORD is always 32 bits, so first two revision numbers                     // come from dwFileVersionMS, last two come from dwFileVersionLS                     TRACE( "File Version: %d.%d.%d.%d\n",                     ( verInfo->dwFileVersionMS >> 16 ) & 0xffff,                     ( verInfo->dwFileVersionMS >>  0 ) & 0xffff,                     ( verInfo->dwFileVersionLS >> 16 ) & 0xffff,                     ( verInfo->dwFileVersionLS >>  0 ) & 0xffff                     );                 }             }         }     }     delete[] verData; } 
like image 78
crashmstr Avatar answered Oct 14 '22 00:10

crashmstr


All these solutions did not work properly (with my system). I found out that each of the four parts of the version number are saved as a 16-bit value.

The first two numbers are saved in the 32-bit DWORD dwFileVersionMS, and the second two in dwFileVersionLS. So I edited your code at the output section like this:

    TRACE( "File Version: %d.%d.%d.%d\n",         ( pFileInfo->dwFileVersionMS >> 16 ) & 0xffff,         ( pFileInfo->dwFileVersionMS >>  0 ) & 0xffff,         ( pFileInfo->dwFileVersionLS >> 16 ) & 0xffff,         ( pFileInfo->dwFileVersionLS >>  0 ) & 0xffff         ); 

And it works perfectly. The output is formatted like on my system:

major.minor.build.revision

like image 32
Dave Chandler Avatar answered Oct 14 '22 01:10

Dave Chandler