Article View: borland.public.cppbuilder.nativeapi
Article #3227Re: Problem extracting version information from EXE
From: JD
Date: Sun, 06 Aug 2006 11:39
Date: Sun, 06 Aug 2006 11:39
104 lines
5695 bytes
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-mailReferences:
<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