V
Habe mir für das Version auslesen eine Klasse geschrieben:
Header
//---------------------------------------------------------------------------
#ifndef cVersionInfoH
#define cVersionInfoH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
const int VI_COMPANY_NAME = 0;
const int VI_FILE_DESCRIPTION = 1;
const int VI_FILE_VERSION = 2;
const int VI_INTERNAL_NAME = 3;
const int VI_LEGAL_COPYRIGHT = 4;
const int VI_LEGAL_TRADEMARKS = 5;
const int VI_ORIGINAL_FILENAME = 6;
const int VI_PRODUCT_NAME = 7;
const int VI_PRODUCT_VERSION = 8;
const int VI_FILE_COMMENTS = 9;
//---------------------------------------------------------------------------
class TVerInfo
{
private:
String company_name;
String file_description;
String file_version;
String internal_name;
String legal_copyright;
String legal_trademarks;
String original_filename;
String product_name;
String product_version;
String file_comments;
protected:
wchar_t *GetVersionKey(wchar_t *buffer, const String &prefix, wchar_t *key);
public:
TVerInfo(String slExeName);
String GetVerInfo(int ilId);
};
//---------------------------------------------------------------------------
#endif
CPP
//---------------------------------------------------------------------------
#pragma hdrstop
#include "cVersionInfo.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#include <vcl.h>
#include <memory>
//---------------------------------------------------------------------------
TVerInfo::TVerInfo(String slExeName)
{
DWORD handle; // Dummy, Windows does not use this parameter.
DWORD size;
if(!FileExists(slExeName)) { slExeName=Application->ExeName; }
size = GetFileVersionInfoSize(slExeName.w_str(), &handle);
if(size == 0) return; // No file information
wchar_t *buffer = new wchar_t [size];
bool status = GetFileVersionInfo(slExeName.w_str(), 0, size, buffer);
if(!status) {
delete [] buffer;
return;
}
// Extract the language ID
UINT datasize;
unsigned short *translation;
/*status =*/ VerQueryValue( buffer, L"\\VarFileInfo\\Translation",
(void **) &translation, &datasize);
// Here we create a prefix string that is the same for all the keys.
String prefix = "\\StringFileInfo\\"
+ String::IntToHex(translation [0], 4)
+ String::IntToHex(translation [1], 4);
// Extract all the version information.
company_name = GetVersionKey(buffer, prefix, L"CompanyName");
file_description = GetVersionKey(buffer, prefix, L"FileDescription");
file_version = GetVersionKey(buffer, prefix, L"FileVersion");
internal_name = GetVersionKey(buffer, prefix, L"InternalName");
legal_copyright = GetVersionKey(buffer, prefix, L"LegalCopyright");
legal_trademarks = GetVersionKey(buffer, prefix, L"LegalTrademarks");
original_filename = GetVersionKey(buffer, prefix, L"OriginalFilename");
product_name = GetVersionKey(buffer, prefix, L"ProductName");
product_version = GetVersionKey(buffer, prefix, L"ProductVersion");
file_comments = GetVersionKey(buffer, prefix, L"Comments");
delete [] buffer;
}
//---------------------------------------------------------------------------
wchar_t* TVerInfo::GetVersionKey(wchar_t *buffer, const String &prefix, wchar_t *key)
{
wchar_t *data;
UINT datasize;
String fullkey = prefix + "\\" + key;
bool status = VerQueryValue(buffer, fullkey.w_str(), (void **) &data, &datasize);
if(status)
return(data);
else
return(L"");
}
//---------------------------------------------------------------------------
String TVerInfo::GetVerInfo(int ilId)
{
switch (ilId) {
case VI_COMPANY_NAME : return company_name;
case VI_FILE_DESCRIPTION : return file_description;
case VI_FILE_VERSION : return file_version;
case VI_INTERNAL_NAME : return internal_name;
case VI_LEGAL_COPYRIGHT : return legal_copyright;
case VI_LEGAL_TRADEMARKS : return legal_trademarks;
case VI_ORIGINAL_FILENAME : return original_filename;
case VI_PRODUCT_NAME : return product_name;
case VI_PRODUCT_VERSION : return product_version;
case VI_FILE_COMMENTS : return file_comments;
default : return file_version;
}
}
//---------------------------------------------------------------------------