🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.cppbuilder.nativeapi
Article #3227

Re: Problem extracting version information from EXE

#3227
From: JD
Date: Sun, 06 Aug 2006 11:39
104 lines
5695 bytes
Kris <test@test.com> wrote:
>

Try this:

//-------------------------------------------------------------
#ifndef VerInfoH
#define VerInfoH
//-------------------------------------------------------------
struct TVersionInformation
{
    private:
        char *Buffer;
    public:
        bool Available;
        AnsiString CompanyName;
        AnsiString FileDescription;
        AnsiString FileVersion;
        AnsiString InternalName;
        AnsiString LegalCopyright;
        AnsiString LegalTrademarks;
        AnsiString OriginalFilename;
        AnsiString ProductName;
        AnsiString ProductVersion;
        AnsiString Comments;
    TVersionInformation()
    {
        Buffer = NULL;
        Available        = false;
        CompanyName      = "";
        FileDescription  = "";
        FileVersion      = "";
        InternalName     = "";
        LegalCopyright   = "";
        LegalTrademarks  = "";
        OriginalFilename = "";
        ProductName      = "";
        ProductVersion   = "";
        Comments         = "";

        DWORD Handle, Size = ::GetFileVersionInfoSize( Application->ExeName.c_str(), &Handle );
        if( Size )
          {
              UINT Length;
              LPVOID lpBuffer;
              unsigned short *LangCharSet;
              Buffer = new char[ Size ];
              LPVOID pBlock = (LPVOID) Buffer;
              if( ::GetFileVersionInfo( Application->ExeName.c_str(), Handle, Size, pBlock ) )
                {
                    if( ::VerQueryValue( pBlock, "\\VarFileInfo\\Translation", (void **)&LangCharSet, &Length ) )
                      {
                          AnsiString Prefix;
                          Prefix.sprintf("\\StringFileInfo\\%04x%04x\\", LangCharSet[0], LangCharSet[1] );
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "CompanyName" ).c_str(),      &lpBuffer, &Length ) ) CompanyName      = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "FileDescription" ).c_str(),  &lpBuffer, &Length ) ) FileDescription  = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "FileVersion" ).c_str(),      &lpBuffer, &Length ) ) FileVersion      = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "InternalName" ).c_str(),     &lpBuffer, &Length ) ) InternalName     = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "LegalCopyright" ).c_str(),   &lpBuffer, &Length ) ) LegalCopyright   = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "LegalTrademarks" ).c_str(),  &lpBuffer, &Length ) ) LegalTrademarks  = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "OriginalFilename" ).c_str(), &lpBuffer, &Length ) ) OriginalFilename = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "ProductName" ).c_str(),      &lpBuffer, &Length ) ) ProductName      = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "ProductVersion" ).c_str(),   &lpBuffer, &Length ) ) ProductVersion   = (char *) lpBuffer;
                          if( ::VerQueryValue( pBlock, AnsiString( Prefix + "Comments" ).c_str(),         &lpBuffer, &Length ) ) Comments         = (char *) lpBuffer;
                          Available = true;
                      }
                }
          }
    }
    ~TVersionInformation()
    {
        if( Buffer ) delete [] Buffer;
    }
};
//-------------------------------------------------------------
#endif


usage:

#include "VersionInfo.h"
//-------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TVersionInformation Info;
    if( Info.Available )
      {
          ShowMessage("CompanyName : "      + Info.CompanyName );
          ShowMessage("FileDescription : "  + Info.FileDescription );
          ShowMessage("FileVersion : "      + Info.FileVersion );
          ShowMessage("InternalName : "     + Info.InternalName );
          ShowMessage("LegalCopyright : "   + Info.LegalCopyright );
          ShowMessage("LegalTrademarks : "  + Info.LegalTrademarks );
          ShowMessage("OriginalFilename : " + Info.OriginalFilename );
          ShowMessage("ProductName : "      + Info.ProductName );
          ShowMessage("ProductVersion : "   + Info.ProductVersion );
          ShowMessage("Comments : "         + Info.Comments );
      }
    else ShowMessage("Version Information Not Available.");
}
//-------------------------------------------------------------

~ JD
Technical Details
Message-ID: <44d5d4eb@newsgroups.borland.com>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!newsgroups.borland.com!not-for-mail
References: <23jbd29tqg0vjln1uve2kpjacpd4kkk4el@4ax.com>

Show Full Headers
Complete Article Headers
X-Google-Thread: 10cc67,959957ffa3cd8000
X-Google-Attributes: gid10cc67,public
X-Google-Language: ENGLISH,ASCII-7-bit
From: "JD" <nospam@nospam.com>
Sender: "JD" <nospam@nospam.com>
Reply-To: "JD" <nospam@nospam.com>
Subject: Re: Problem extracting version information from EXE
Newsgroups: borland.public.cppbuilder.nativeapi
X-User-Info: 152.163.100.201     
X-Forwarded-For: 172.145.185.187
References:  <23jbd29tqg0vjln1uve2kpjacpd4kkk4el@4ax.com>
NNTP-Posting-Host: 207.105.83.66
Message-ID: <44d5d4eb@newsgroups.borland.com>
Date: 6 Aug 2006 04:39:23 -0700
X-Trace: newsgroups.borland.com 1154864363 207.105.83.66 (6 Aug 2006 04:39:23 -0700)
Lines: 105
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!newsgroups.borland.com!not-for-mail