Announcement

Collapse
No announcement yet.

Auslesen der eigenen Programmversion und Build#

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

  • Auslesen der eigenen Programmversion und Build#

    Hallo,
    oft steht doch in einem Programminfofenster die genaue Versionsnummer, bzw. Build-Nr. Ich fände das praktisch, wenn das Programm die direkt auslesen könnte, und ich die nicht von Hand eingeben muß. Man kann doch bei den Projektoptionen die Versionskontrolle einschalten. Habe die Hilfe durchsucht, aber nichts übers Auslesen gefunden.
    <p>
    CU<p>

    B. Rensch

  • #2
    <PRE><TT><br><B>procedure</B> TForm1.Button1Click(Sender: TObject);<br><B>var</B><br> aFileName: <B>array</B> [0..MAX_PATH] <B>of</B> Char;<br> pdwHandle: DWORD;<br> nInfoSize: DWORD;<br> pFileInfo: Pointer;<br> pFixFInfo: PVSFixedFileInfo;<br> nFixFInfo: DWORD;<br> pVarFInfo: PChar;<br> nVarFInfo: DWORD;<br> nVarTrans: DWORD;<br> aVarFPath: <B>array</B> [0..MAX_PATH] <B>of</B> Char;<br><B>begin</B><br> GetModuleFileName(0, aFileName, MAX_PATH);<br> pdwHandle := 0;<br> nInfoSize := GetFileVersionInfoSize(aFileName, pdwHandle);<br> <B>if</B> nInfoSize <> 0 <B>then</B><br> pFileInfo := GetMemory(nInfoSize)<br> <B>else</B><br> pFileInfo := <B>nil</B>;<br> <B>if</B> Assigned(pFileInfo) <B>then</B><br> <B>try</B><br> <B>if</B> GetFileVersionInfo(aFileName, pdwHandle, nInfoSize, pFileInfo) <B>then</B><br> <B>begin</B><br> <FONT COLOR="#000080"><I>// den vordefinierten Info-Block holen, der in jeder</I></FONT><br> <FONT COLOR="#000080"><I>// Versionsinformation enthalten sein sollte.</I></FONT><br> pFixFInfo := <B>nil</B>;<br> nFixFInfo := 0;<br> <B>if</B> VerQueryValue(pFileInfo, <FONT COLOR="#0000FF">'\'</FONT>, Pointer(pFixFInfo), nFixFInfo) <B>then</B><br> <B>begin</B><br> <FONT COLOR="#000080"><I>// Bei von Delphi erzeugten Info-Blöcken sind die Dateiversion</I></FONT><br> <FONT COLOR="#000080"><I>// und die Produktversion im FixedInfo-Block immer gleich.</I></FONT><br> Label1.Caption := Format(<FONT COLOR="#0000FF">'Version (fix): %d.%d.%d.%d.'</FONT>,<br> [HiWord(pFixFInfo^.dwFileVersionMS),<br> LoWord(pFixFInfo^.dwFileVersionMS),<br> HiWord(pFixFInfo^.dwFileVersionLS),<br> LoWord(pFixFInfo^.dwFileVersionLS)]);<br> <B>end</B>;<br> <FONT COLOR="#000080"><I>// Erst die Sprache(n) ermitteln und dann abfragen</I></FONT><br> pVarFInfo := <B>nil</B>;<br> nVarFInfo := 0;<br> <B>if</B> VerQueryValue(pFileInfo, <FONT COLOR="#0000FF">'\VarFileInfo\Translation'</FONT>,<br> Pointer(pVarFInfo), nVarFInfo) <B>then</B><br> <B>begin</B><br> <FONT COLOR="#000080"><I>// erste Sprache holen</I></FONT><br> nVarTrans := HiWord(PDWORD(pVarFInfo)^)<br> <B>or</B> (Word(PDWORD(pVarFInfo)^) <B>shl</B> 16);<br> wvsprintf(aVarFPath, <FONT COLOR="#0000FF">'\StringFileInfo\%8.8x\'</FONT>, PChar(@nVarTrans));<br> <FONT COLOR="#000080"><I>// Standard-Wert 'Dateiversion' abfragen</I></FONT><br> <FONT COLOR="#000080"><I>// (Standardisierte Werte sind: CompanyName FileDescription FileVersion</I></FONT><br> <FONT COLOR="#000080"><I>// InternalName LegalCopyright OriginalFilename ProductName</I></FONT><br> <FONT COLOR="#000080"><I>// ProductVersion - wobei diese für alle Sprachen gelten)</I></FONT><br> lstrcat(aVarFPath, <FONT COLOR="#0000FF">'FileVersion'</FONT>);<br> pVarFInfo := <B>nil</B>;<br> nVarFInfo := 0;<br> <B>if</B> VerQueryValue(pFileInfo, aVarFPath, Pointer(pVarFInfo), nVarFInfo) <B>then</B><br> <B>begin</B><br> Label2.Caption := <FONT COLOR="#0000FF">'Dateiversion (var): '</FONT> + TCaption(pVarFInfo);<br> <B>end</B>;<br> <B>end</B>;<br> <B>end</B>;<br> <B>finally</B><br> FreeMemory(pFileInfo);<br> <B>end</B>;<br><B>end</B>;<br></TT></PRE><p>Grundsätzlich gibt es also mindestens einen festdefinierten<br>Infoblock, den man erfragen kann (deren Werte in Delphi im<br>Optionen-Dialog in der oberen Hälfte eingestellt werden).<br>Und es gibt eine Liste von Info-Blöcken in verschiedenen<br>Sprachen, die in einer Tabelle stehen (der untere Teil des<br>
    Dialogs - wobei Delphi nur einen Sprachenblock anlegen kann/will).<br>
    Bei den Einträgen in den Sprachen-Blöcken gibt es bestimmte<br>
    standardisierte Einträge (die übrigens immer englisch sind,<br>
    damit

    Comment


    • #3
      <PRE><TT><br><B>procedure</B> TForm1.Button1Click(Sender: TObject);<br><B>var</B><br> aFileName: <B>array</B> [0..MAX_PATH] <B>of</B> Char;<br> pdwHandle: DWORD;<br> nInfoSize: DWORD;<br> pFileInfo: Pointer;<br> pFixFInfo: PVSFixedFileInfo;<br> nFixFInfo: DWORD;<br> pVarFInfo: PChar;<br> nVarFInfo: DWORD;<br> nVarTrans: DWORD;<br> aVarFPath: <B>array</B> [0..MAX_PATH] <B>of</B> Char;<br><B>begin</B><br> GetModuleFileName(0, aFileName, MAX_PATH);<br> pdwHandle := 0;<br> nInfoSize := GetFileVersionInfoSize(aFileName, pdwHandle);<br> <B>if</B> nInfoSize <> 0 <B>then</B><br> pFileInfo := GetMemory(nInfoSize)<br> <B>else</B><br> pFileInfo := <B>nil</B>;<br> <B>if</B> Assigned(pFileInfo) <B>then</B><br> <B>try</B><br> <B>if</B> GetFileVersionInfo(aFileName, pdwHandle, nInfoSize, pFileInfo) <B>then</B><br> <B>begin</B><br> <FONT COLOR="#000080"><I>// den vordefinierten Info-Block holen, der in jeder</I></FONT><br> <FONT COLOR="#000080"><I>// Versionsinformation enthalten sein sollte.</I></FONT><br> pFixFInfo := <B>nil</B>;<br> nFixFInfo := 0;<br> <B>if</B> VerQueryValue(pFileInfo, <FONT COLOR="#0000FF">'\'</FONT>, Pointer(pFixFInfo), nFixFInfo) <B>then</B><br> <B>begin</B><br> <FONT COLOR="#000080"><I>// Bei von Delphi erzeugten Info-Blöcken sind die Dateiversion</I></FONT><br> <FONT COLOR="#000080"><I>// und die Produktversion im FixedInfo-Block immer gleich.</I></FONT><br> Label1.Caption := Format(<FONT COLOR="#0000FF">'Version (fix): %d.%d.%d.%d.'</FONT>,<br> [HiWord(pFixFInfo^.dwFileVersionMS),<br> LoWord(pFixFInfo^.dwFileVersionMS),<br> HiWord(pFixFInfo^.dwFileVersionLS),<br> LoWord(pFixFInfo^.dwFileVersionLS)]);<br> <B>end</B>;<br> <FONT COLOR="#000080"><I>// Erst die Sprache(n) ermitteln und dann abfragen</I></FONT><br> pVarFInfo := <B>nil</B>;<br> nVarFInfo := 0;<br> <B>if</B> VerQueryValue(pFileInfo, <FONT COLOR="#0000FF">'\VarFileInfo\Translation'</FONT>,<br> Pointer(pVarFInfo), nVarFInfo) <B>then</B><br> <B>begin</B><br> <FONT COLOR="#000080"><I>// erste Sprache holen</I></FONT><br> nVarTrans := HiWord(PDWORD(pVarFInfo)^)<br> <B>or</B> (Word(PDWORD(pVarFInfo)^) <B>shl</B> 16);<br> wvsprintf(aVarFPath, <FONT COLOR="#0000FF">'\StringFileInfo\%8.8x\'</FONT>, PChar(@nVarTrans));<br> <FONT COLOR="#000080"><I>// Standard-Wert 'Dateiversion' abfragen</I></FONT><br> <FONT COLOR="#000080"><I>// (Standardisierte Werte sind: CompanyName FileDescription FileVersion</I></FONT><br> <FONT COLOR="#000080"><I>// InternalName LegalCopyright OriginalFilename ProductName</I></FONT><br> <FONT COLOR="#000080"><I>// ProductVersion - wobei diese für alle Sprachen gelten)</I></FONT><br> lstrcat(aVarFPath, <FONT COLOR="#0000FF">'FileVersion'</FONT>);<br> pVarFInfo := <B>nil</B>;<br> nVarFInfo := 0;<br> <B>if</B> VerQueryValue(pFileInfo, aVarFPath, Pointer(pVarFInfo), nVarFInfo) <B>then</B><br> <B>begin</B><br> Label2.Caption := <FONT COLOR="#0000FF">'Dateiversion (var): '</FONT> + TCaption(pVarFInfo);<br> <B>end</B>;<br> <B>end</B>;<br> <B>end</B>;<br> <B>finally</B><br> FreeMemory(pFileInfo);<br> <B>end</B>;<br><B>end</B>;<br></TT></PRE><p>
      Grundsätzlich gibt es also mindestens einen festdefinierten Infoblock, den man erfragen kann (deren Werte in Delphi im Optionen-Dialog in der oberen Hälfte eingestellt werden).<br>
      Und es gibt eine Liste von Info-Blöcken in verschiedenen Sprachen, die in einer Tabelle stehen (der untere Teil des Dialogs - wobei Delphi nur einen Sprachenblock anlegen kann/will).<br>
      Bei den Einträgen in den Sprachen-Blöcken gibt es bestimmte standardisierte Einträge (die übrigens immer englisch sind)...
      <p>
      Gruß Nic

      Comment


      • #4
        Danke Nico. Sieht gut aus

        Comment

        Working...
        X