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;
    	}
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten