Versionsinfo des eigenen Programms auslesen
-
Hi,
ich Versuch die Versionsinfo, die ich unter Projektoptionen einstellen kann in meinem Projekt einzubinden.
Habe schon die Suche benutzt kann aber nur Klassen finden bei der man jeder beliebige Versionsinfo lesen kann. Ich wollte das nicht so kompliziert machen.
Kann man irgendwie einfach an den Versionsinfo String aus den Projekteinstellungen rankommen? Also existiert da vielleicht eine Funktion die einem den Pointer auf den String zurück gibt oder sowas?
MfG
-
Hallo,
Wenn du das hier meinst
http://www.bytesandmore.de/rad/cpp/snipp/sc06001.php
Was viel einfacheres ist mir nicht bekannt.
Vielleicht noch das hier.// Funktion liefert einen AnsiString der Versionsnummer der übergebenen Datei AnsiString GetFileVersionString(const AnsiString &FileName) { // prüfen ob überhaupt Info da sind DWORD nSize = GetFileVersionInfoSize(FileName.c_str(), 0); AnsiString Result(""); if (nSize) { char *pInfo = new char[nSize]; // Versionsinfo auslesen GetFileVersionInfo(FileName.c_str(), 0, nSize, pInfo); VS_FIXEDFILEINFO *FileInfo; UINT uLen; // Root-Information auslesen VerQueryValue(pInfo, "\\", (void**) &FileInfo, (PUINT) &uLen); // Speicher freigeben delete [] pInfo; // Versionsnummer bilden Result.sprintf("%d.%d.%d.%d", HIWORD(FileInfo->dwFileVersionMS), LOWORD(FileInfo->dwFileVersionMS), HIWORD(FileInfo->dwFileVersionLS), LOWORD(FileInfo->dwFileVersionLS)); } return Result; } //---------------------------------------------------------------------------
-
Hi,
jetzt stellt sich natürlich für mich die Frage wie ich in meiner Applikation den Pointer auf meinen Filename bekomme?
den die Datei kann man ja immer beliebig umbennen wenn das Programm nicht läuft.
MfG
-
Schau mal unter: Application->ExeName-
-
Kann mir jemand sagen, wie ich den obigen Code auf Unicode, sprich String statt ansistring, ändern muss?
Danke
-
Versuchs mal so:
String __fastcall TForm1::GetProgVersion() { DWORD nSize = GetFileVersionInfoSize(Application->ExeName.c_str(), 0); String Result(""); if (nSize) { char *pInfo = new char[nSize]; // Versionsinfo auslesen GetFileVersionInfo(Application->ExeName.c_str(), 0, nSize, pInfo); VS_FIXEDFILEINFO *FileInfo; UINT uLen; // Root-Information auslesen VerQueryValue(pInfo, _T("\\"), (void**) &FileInfo, (PUINT) &uLen); // Speicher freigeben delete[] pInfo; // Versionsnummer bilden Result.sprintf(_T("%d.%d.%d.%d"), HIWORD(FileInfo->dwFileVersionMS), LOWORD(FileInfo->dwFileVersionMS), HIWORD(FileInfo->dwFileVersionLS), LOWORD(FileInfo->dwFileVersionLS)); } return Result; } //---------------------------------------------------------------------------
-
Du mußt doch nur AnsiString durch UnicodeString oder WideString (bzw. String) ersetzen. Auch da gibt es sprintf. Evtl. müssen hier noch die Formatangaben in wchar_t Literale umgewandelt werden.
-
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; } } //---------------------------------------------------------------------------