I Decided the source is not to much to post it here:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "gversion.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#include <stdio.h>
// swt ist a Variable to distinquish which file (exe or DLL) should be read. exe=0 dll=1
MyVersionInfo::MyVersionInfo(int swt)
{
DWORD fvHandle;
UINT vSize;
char appFName[255];
char *subBlockName = new char[255];
FVData = 0;
if(swt==0)
strcpy(appFName, Application->ExeName.c_str());
if(swt==1)
strcpy(appFName, "userdll.dll"

;
OemToChar(appFName, appFName);
DWORD dwSize = ::GetFileVersionInfoSize(appFName, &fvHandle);
if (dwSize)
{
FVData = (void far *) new char[(UINT) dwSize];
if

:GetFileVersionInfo(appFName, fvHandle, dwSize, FVData))
{
strcpy(subBlockName, "\\VarFileInfo\\Translation"

;
if (!::VerQueryValue(FVData, subBlockName,(void far* far*)&TransBlock, &vSize))
{
delete[] FVData;
FVData = 0;
}
else
{
*(DWORD *) TransBlock = MAKELONG(HIWORD(*(DWORD *)TransBlock), LOWORD(*(DWORD *)TransBlock));
}
}
}
}
MyVersionInfo::~MyVersionInfo()
{
if (FVData)
delete[] FVData;
}
bool MyVersionInfo::GetProductName(LPSTR& prodName)
{
UINT vSize;
char subBlockName[255];
if(FVData)
{
sprintf(subBlockName, "\\StringFileInfo\\%08lx\\%s", *(DWORD *) TransBlock, (LPSTR) "ProductName"

;
return FVData ? ::VerQueryValue(FVData, subBlockName,(void far* far*)&prodName, &vSize) : false;
}
else
return(false);
}
bool MyVersionInfo::GetFileVersion(LPSTR& fileVersion)
{
UINT vSize;
char subBlockName[255];
if(FVData)
{
sprintf(subBlockName, "\\StringFileInfo\\%08lx\\%s", *(DWORD *)TransBlock, (LPSTR) "FileVersion"

;
return FVData ? ::VerQueryValue(FVData, subBlockName,(void far* far*) &fileVersion, &vSize) : false;
}
else
return(false);
}
bool MyVersionInfo::GetProdVersion(LPSTR& prodVersion)
{
UINT vSize;
char subBlockName[255];
if(FVData)
{
sprintf(subBlockName, "\\StringFileInfo\\%08lx\\%s", *(DWORD *)TransBlock, (LPSTR) "ProductVersion"

;
return FVData ? ::VerQueryValue(FVData, subBlockName,(void far* far*) &prodVersion, &vSize) : false;
}
else
return(false);
}
bool MyVersionInfo::GetCopyright(LPSTR& copyright)
{
UINT vSize;
char subBlockName[255];
if(FVData)
{
sprintf(subBlockName, "\\StringFileInfo\\%08lx\\%s", *(DWORD *)TransBlock, (LPSTR) "LegalCopyright"

;
return FVData ? ::VerQueryValue(FVData, subBlockName,(void far* far*) ©right, &vSize) : false;
}
else
return(false);
}
bool MyVersionInfo::GetComment(LPSTR& comment)
{
UINT vSize;
char subBlockName[255];
if(FVData)
{
sprintf(subBlockName, "\\StringFileInfo\\%08lx\\%s", *(DWORD *)TransBlock, (LPSTR) "FileDescription"

;
return FVData ? ::VerQueryValue(FVData, subBlockName,(void far* far*) &comment, &vSize) : false;
}
else
return(false);
}
// VS_FF_DEBUG => Schalter "Fehlersuche"
// VS_FF_INFOINFERRED
// VS_FF_PATCHED
// VS_FF_PRERELEASE => Schalter "Testversion gesetzt"
// VS_FF_PRIVATEBUILD
// VS_FF_SPECIALBUILD
bool MyVersionInfo::GetFlags(LPSTR& flags)
{
UINT vSize;
char subBlockName[255];
if(FVData)
{
sprintf(subBlockName, "\\"

;
::VerQueryValue(FVData, subBlockName, (void far* far*) &flags, &vSize);
return(true);
}
return(false);
}
============================================================
//---------------------------------------------------------------------------
#ifndef gversionH
#define gversionH
//---------------------------------------------------------------------------
class MyVersionInfo
{
public:
MyVersionInfo(int swt);
virtual ~MyVersionInfo();
bool GetProductName(LPSTR& prodName);
bool GetFileVersion(LPSTR& fileVersion);
bool GetProdVersion(LPSTR& fileVersion);
bool GetCopyright(LPSTR& copyright);
bool GetComment(LPSTR& comment);
bool GetFlags(LPSTR& flags);
protected:
BYTE far* TransBlock;
void far* FVData;
private:
MyVersionInfo(const MyVersionInfo&);
MyVersionInfo& operator = (const MyVersionInfo&);
};
#endif
============================================================
Calling sequence:
[.....]
LPSTR produkt=0, compstatus=0, flags=0, productversion=0;
MyVersionInfo *versioninfo;
versioninfo = new MyVersionInfo(0);
versioninfo->GetProductName(produkt);
versioninfo->GetFileVersion(compstatus);
versioninfo->GetProdVersion(productversion);
versioninfo->GetFlags(flags);
delete (versioninfo);
[...]
Hope it helps
hnd
hasso55@yahoo.com