Announcement

Collapse
No announcement yet.

Versionsinfo programmtechnisch auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Versionsinfo programmtechnisch auslesen

    Wie kann ich die Versionsnummer aus den Projektoptionen im Programm auslesen und danach z. Bsp in ein INI-File oder in die Registry schreiben.

    Gruss
    DanyS

  • #2
    Hallo, hier ein C++ Builder-Quelltext (passt nicht ganz rein):

    *** Copyright (c) Informationstechnik Grieb GmbH 2000 ***<br>

    #include &lt;Project.hpp><br>
    #pragma hdrstop<br>
    <br>
    #include "windows.h"<br>
    <br>
    #pragma package(smart_init)<br>
    <br>
    String GetInfo( const String&amp; rFileName,<br>
    const String&amp; rKey,<br>
    const String&amp; rCharSet )<br>
    {<br>
    <br>
    &nbsp;&nbsp;&nbsp; DWORD dwHandle;<br>
    &nbsp;&nbsp;&nbsp; DWORD dwLength;<br>
    &nbsp;&nbsp;&nbsp; char *szBuff;<br>
    &nbsp;&nbsp;&nbsp; String aValue = "????";<br>
    <br>
    &nbsp;&nbsp;&nbsp; dwLength = GetFileVersionInfoSize( rFileName.c_str(), &amp;dwHandle );<br>
    &nbsp;&nbsp;&nbsp; if( dwLength )<br>
    &nbsp;&nbsp;&nbsp; {<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szBuff = (char*) malloc( dwLength );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( szBuff )<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; if ( GetFileVersionInfo( rFileName.c_str(), 0, dwLength, (LPVOID)szBuff ) )<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    LPVOID lpInfo;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    unsigned int cch = 0;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    char buff[2048];<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    memset( buff, 0, sizeof( buff ) );<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    String aKey = "StringFileInfo\\" + rCharSet + "\\" + rKey;<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    if ( VerQueryValue(szBuff, aKey.c_str(), &amp;lpInfo, &amp;cch) )<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;
    memcpy( (void*)buff, lpInfo, cch );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;
    aValue = String( buff );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    }<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; }<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; free( szBuff );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
    &nbsp;&nbsp;&nbsp; }<br>
    <br>
    &nbsp;&nbsp;&nbsp; return aValue;<br>
    }<br>
    String PACKAGE __fastcall GetCompanyName( const String&amp; rFileName, const String&amp; rCharSet )<br>
    {<br>
    &nbsp;&nbsp;&nbsp; return GetInfo( rFileName, String( "CompanyName" ), rCharSet );<br>
    }<br>
    String PACKAGE __fastcall GetFileVersion( const String&amp; rFileName, const String&amp; rCharSet )<br>
    {<br>
    &nbsp;&nbsp;&nbsp; return GetInfo( rFileName, String( "FileVersion" ), rCharSet );<br>
    }<br>
    String PACKAGE __fastcall GetOriginalFilename( const String&amp; rFileName, const String&amp; rCharSet )<br>
    {<br>
    &nbsp;&nbsp;&nbsp; return GetInfo( rFileName, String( "OriginalFilename" ), rCharSet );<br>
    }<br>
    String PACKAGE __fastcall GetFileDescription( const String&amp; rFileName, const String&amp; rCharSet )<br>
    {<br>
    &nbsp;&nbsp;&nbsp; return GetInfo( rFileName, String( "FileDescription" ), rCharSet );<br>
    }<br>
    String PACKAGE __fastcall GetInternalName( const String&amp; rFileName, const String&amp; rCharSet )<br>
    {<br>
    &nbsp;&nbsp;&nbsp; return GetInfo( rFileName, String( "InternalName" ), rCharSet );<br>
    }<br>
    String PACKAGE __fastcall GetLegalCopyright( const String&amp; rFileName, const String&amp; rCharSet

    Comment


    • #3
      Ich möchte die Projektoptionen aus dem Borland-Projekt, dass ich zur Zeit erstelle, auslesen und in einem Info-Dialog darstellen.
      Ich möchte keine Versionsinfo eines anderen Programms ermitelln.

      Hat jemand eine Ahnung wie man das macht?

      Gruss
      Dany

      Comment


      • #4
        Ich mache das mit einer Klasse:

        Im Proramm beim erzeugen des Dialoges:
        <PRE>
        void __fastcall TCopyright::FormCreate(TObject *Sender)
        {
        String test;
        TVersionInfo *info=new TVersionInfo();
        info->GetProductName(test);
        Programmname->Caption=test;
        info->GetFileVersion(test);
        Version->Caption=test;
        info->GetCopyright(test);
        .....
        }

        Hier die Klasse:
        #include "VersionInfo.h"
        #include <stdio.h>
        #pragma package(smart_init)
        //---------------------------------------------------------------------------

        /*
        Methoden:

        bool GetProductName(String &strProductName);
        bool GetFileVersion(String &strFileVersion);
        bool GetCopyright(String &strCopyright);
        bool GetFileDescription(String &strFileDescription);
        bool GetCompanyName(String &strCompanyName);
        */
        TVersionInfo::TVersionInfo()
        {
        DWORD handle;
        unsigned int uiSize;
        char *pcSubBlock = "\\VarFileInfo\\Translation";

        m_pvData = NULL;

        DWORD dwSize = GetFileVersionInfoSize(Application->ExeName.c_str(), &handle);

        if (dwSize)
        {
        m_pvData = new char[static_cast<unsigned int>(dwSize)];
        if (GetFileVersionInfo(Application->ExeName.c_str(), handle, dwSize, m_pvData))
        {
        // Wenn in m_pvData die Versioninfos liegen, dann liefert VerQueryValue != 0 zurück
        if (VerQueryValue( m_pvData, pcSubBlock, (void **)(&m_pdwTransBlock), &uiSize) == 0 )
        {
        delete[] m_pvData;
        m_pvData = NULL;
        }
        else
        {
        // High und Low-Word vertauschen um nachher den richtigen Ländercode zu haben.
        DWORD dwLow = static_cast<DWORD>(LOWORD(*m_pdwTransBlock)) << 16;
        DWORD dwHigh = static_cast<DWORD>(HIWORD(*m_pdwTransBlock));
        *m_pdwTransBlock = dwHigh | dwLow;
        }
        }
        }

        }

        TVersionInfo::~TVersionInfo()
        {
        if (m_pvData)
        delete[] m_pvData;
        }
        //---------------------------------------------------------------------------

        bool TVersionInfo::GetProductName(AnsiString & strProductName)
        {
        //TODO: Add your source code here
        bool bResult = false;
        unsigned int uiSize;

        char caySubBlock[255];
        char cayProductName[255];
        char *pcProductName = cayProductName;

        if (m_pvData != NULL)
        {
        sprintf(caySubBlock, "\\StringFileInfo\\%08lx\\ProductName", *m_pdwTransBlock);

        if (VerQueryValue(m_pvData, caySubBlock, (void **)&pcProductName, &uiSize) != 0)
        {
        strProductName = pcProductName;
        bResult = true;
        }

        }

        return bResult;
        }
        //---------------------------------------------------------------------------

        bool TVersionInfo::GetFileVersion(AnsiString & strFileVersion)
        {
        //TODO: Add your source code here
        bool bResult = false;
        unsigned int uiSize;

        char caySubBlock[255];
        char cayFileVersion[255];
        char *pcFileVersion = cayFileVersion;

        if (m_pvData != NULL)
        {
        sprintf(caySubBlock, "\\StringFileInfo\\%08lx\\FileVersion", *m_pdwTransBlock);

        if (VerQueryValue(m_pvData, caySubBlock, (void **)&pcFileVersion, &uiSize) != 0)
        {
        strFileVersion = pcFileVersion;
        bResult = true;
        }

        }

        return bResult;
        }
        //---------------------------------------------------------------------------

        bool TVersionInfo::GetCopyright(AnsiString & strCopyright)
        {
        //TODO: Add your source code here
        bool bResult = false;
        unsigned int uiSize;

        char caySubBlock[255];
        char cayCopyright[255];
        char *pcCopyright = cayCopyright;

        if (m_pvData != NULL)
        {
        sprintf(caySubBlock, "\\StringFileInfo\\%08lx\\LegalCopyright", *m_pdwTransBlock);

        if (VerQueryValue(m_pvData, caySubBlock, (void **)&pcCopyright, &uiSize) != 0)
        {
        strCopyright = pcCopyright;
        bResult = true;
        }

        }

        return bResult;
        }
        //------------------------------------------------------------
        Christian

        Comment


        • #5
          rFileName.c_str()

          brauchst du nur m.E. nur durch

          Application->ExeName.c_str(),

          ersetzen

          Christia
          Christian

          Comment


          • #6
            *m_pdwTransBlock
            m_pvData

            Hallo Christian,

            Hast Du mir noch die Deklaration für die oben aufgeführten Datenvariabeln.

            Könntest du vielleicht, das ganze Header-File der Klasse TVersionsInfo noch ins Forum stellen?

            Vielen Dank für deien Hilfe

            mfg
            Dany

            Comment


            • #7
              ja, mache ich heute aben
              Christian

              Comment


              • #8
                Nix zu danken, hier die Header-Datei
                <PRE>
                //---------------------------------------------------------------------------
                #ifndef VersionInfoH
                #define VersionInfoH

                class TVersionInfo
                {
                private:
                DWORD* m_pdwTransBlock;
                void* m_pvData;

                protected:

                public:
                TVersionInfo();
                ~TVersionInfo();
                bool GetProductName(AnsiString & strProductName);
                bool GetFileVersion(AnsiString & strFileVersion);
                bool GetCopyright(AnsiString & strCopyright);
                bool GetFileDescription(AnsiString & strFileDescription);
                bool GetCompanyName(AnsiString & strCompanyName);
                };

                //---------------------------------------------------------------------------
                #endif
                </PRE&gt
                Christian

                Comment


                • #9
                  Vielen Dank, dass du mir hilfst!

                  Gruss
                  Dany

                  Comment

                  Working...
                  X