FileVersion

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

FileVersion

Beitrag von Jan »

In der .arc einer exe oder dll kann ich ja die FileVersion angeben. Die ich auch in den Dateieigenschaften im Explorer sehen kann.

Seit Jahren lese ich das per DllCall aus. Aber das scheint auf manchen Rechnern einen xppfatal mit einem Stack Overflow auszulösen. Von daher würde ich eine andere Lösung suchen.

Wenn ich mir die Doku zu LoadResource() ansehe könnte das auch damit gehen. Bekomme ich aber auch nicht hin. Mal abgesehen davon, daß die Doku teilweise falsch ist.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: FileVersion

Beitrag von ramses »

Hallo Jan

du musst zuerst die Bufferlänge abfragen um die korrekte Bufferlänge bereitzustellen sonst krachts.

Ich verwende folgende Funktion um die "FileVersion" auszulesen.

Code: Alles auswählen


#include "dll.ch"

function getEXEFileVersion(cFile)
local cbuffer
local dwhandle := nil, nClen := 512
local a:=0,t:="",s, x := "FileVersion"

default cFile to exename()

 do while .t.
   if ( nClen := GetFileVersionInfoSizeA( cFile, a ) ) = 0
     exit
   endif
   cbuffer  := space(nClen)
   if  getfileversioninfoA( cFile, dwHandle, nClen, @cBuffer) = 0
     exit
   endif
     for a = 1 to len(x)
        t += x[a]+chr(0)
     next
     t += chr(0)+chr(0)  
     s := at(t, cBuffer)
     if s != 0
        x := ""
        s += len(t) + 2
        do while .t.
          if cBuffer[s] = chr(0)
             if cBuffer[s+1] = chr(0)
                exit
             endif
          else
            x += cBuffer[s]
          endif
          s++
        enddo
       endif

     exit
 enddo

return(x)

DLLFUNCTION GetFileVersionInfoA( cSourceDir, dwHandle, nClen, @cBuffer ) USING STDCALL from version.DLL
DLLFUNCTION GetFileVersionInfoSizeA( @cSourceDir, @cbuffer ) USING STDCALL from version.DLL

Die ist wohl schon einige Jahre alt, funktioniert aber immer.


Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: FileVersion

Beitrag von Jan »

Hallo Carlo,

zienlich exakt diesen Weg gehe ich auch. Aber wie gesagt - bei manchen Kunden gibt das einen Absturz mit xppfatal. Deswegen würde ich gerne was anderes machen wollen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: FileVersion

Beitrag von ramses »

Hallo Jan

solange es nur deine eigenen "Versionsangaben" sind kannst du diese in der ARC ja nicht nur als "FileVersion" hinterlegen sondern auch noch als andere Angabe die du mit loadresource() direkt laden kannst.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FileVersion

Beitrag von AUGE_OHR »

ich verwende CLASS TFileVersionInfo von Pablo
FileVerInfo.zip
need ot4xb
(47.47 KiB) 245-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: FileVersion

Beitrag von Jan »

... ich bin froh, das ich die ot4xb bei mir überall raus habe. Da werd ich die dafür nicht wieder rein nehmen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FileVersion

Beitrag von AUGE_OHR »

wie du ja selbst sagst gibt es mit der LoadResource() Function von Alaska Probleme also alternative "selbst" machen.

die API Function von Carlo sind die selben die Pablo verwendet nur das der "Speicher" anders angefordert wird.
im übrigen bekommt man bei der CLASS TFileVersionInfo von Pablo "alle" Infos.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: FileVersion

Beitrag von Jan »

Jimmy,

1) hatte ich erwähnt, das ich das mit LoadResource() nicht hinbekommen habe. Wenn mir jemand aufzeigt wie das damit geht bin ich sehr dankbar dafür.

2) hatte ich geschrieben das ich froh bin, die ot4xb losgeworden zu sein. Nur für diese eine Abfrage werde ich die garantiert nicht wieder einbauen. Und da ich auch nicht mehr als nur die Version brauche interessiert mich nicht, was Pablo da noch auslesen kann.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FileVersion

Beitrag von AUGE_OHR »

hi,

was du verwenden möchtest ist mir egal.

da es ein öffentlicher Thread ist wollte ich darauf hinweisen das die CLASS TFileVersionInfo von Pablo "alle" Infos auslesen kann.
grundsätzlich könnte man den ot4xb Code auch umschreiben da keine Structur verwendet wird ... nur wie man den Speicher wieder freigibt

Code: Alles auswählen

INLINE METHOD Destroy()
  ::cFile := NIL
  if( ::pInfo != NIL ) ; _xfree(::pInfo) ; end  // diese Zeile
  ::pInfo := NIL
return NIL
ist in "pure" Xbase++ "so" nicht vorgesehen ... das soll wohl der CG erledigen der aber dazu "Zeit" benötigt die bei vielen DLL Calls hintereinander ein Problem werden könnten.



p.s. wenn jemand mit ot4xb Problem hat der sollte sich direkt im Pablos Forum melden. www.xbwin.com ->Forum

Allerdings darf man NICHT erwarten das Pablo SOFORT antwortet !
ot4xb ist free mit Source und alles was Pablo leistet verdient IMHO höchsten Respekt !
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: FileVersion

Beitrag von ramses »

Hallo Jan

die Zeile:

Code: Alles auswählen


#include "dll.ch"
aVersion := LoadResource(1, XPP_MOD_EXE, RES_VERSION)
gibt ein 2 Dimensionales Array zurück. Einer der Einträge ist dann ... {"FileVersion","Die Version"} ....
soeben getestet mit der Version 2.00.1068


Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: FileVersion

Beitrag von Tom »

LoadResource() funktioniert natürlich nur mit Xbase++-DLLs, mit selbsterzeugten und mit denen, die Alaska für die Runtimes ausliefert. Außerdem gilt es für alle DLLs, die explizit für Xbase++-Anwendungen erzeugt wurden, also für die 3rd-Party-Sachen von OT4XB über Xb2.Net und TopDown sowie XClass++ bis eXpress++. Doku: "LoadResource() kann Resource-Daten aus RES-Dateien laden, die mit ARC.EXE erzeugt wurden und an eine EXE- oder DLL-Datei gelinkt wurden." Es funktioniert nicht bei den ganzen Fremdprodukten, die über entsprechende Wrapper (DLLFUNCTION o.ä.) eingebunden werden, etwa L&L und ähnliche.

Edit: Man kann LoadResource() auch nutzen, um alle möglichen anderen Resourcen zu laden, die man gelinkt hat, weil man sie z.B. nicht in Tabellen oder externen Textdateien oder im Source haben will. Wir binden z.B. eine Reihe von Text-, XML- und HTML-Dokumenten über USERDEF in die ARC-/RES-Dateien ein, aber auch andere Daten, etwa Standardwerte für bestimmte Variablengruppen, Links und ähnliches.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: FileVersion

Beitrag von Jan »

Hallo Carlo,

das klappt ganz hervorragend! Vielen Dank für das Sample.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: FileVersion

Beitrag von Jan »

Tom,

das passt bei mir schon. Alles, wo ich die Versionsnummern benötige sind Xbase++-dll (Alaska oder eigene). Es git bei mir nur eine einzige Fremd-dll, wo aber der Entwickler leider nichts mehr dran macht, von daher muß ich da auch nicht für Updates die aktuelle Version auslesen.

Ich finde es aber natürlich schon irritierend, warum ich überhaupt danach fragen musste. Warum gibt es bei der Windows-dll-Version nur bei bestimmten Kunden eine xppfatal? Es gibt in meinem Programm reproduzierbar drei Stellen, an denen es das gibt:
  • Diese Versionsabfrage
  • Beim Auslesen der auf dem Rechner installierten Schriften per oFont:list()
  • LoadFromUrl()
Das klappt fast überall sauber. Aber da wo es nicht klappt landet der in einem xppfatal. Reproduzierbar bei den gleichen Kunden.

LoadFromUrl() habe ich gerade die letzten Tage komplett auf HttpClient() umgeschrieben. Die Versionsabfrage kommt jetzt dran. Dann bin ich mal gespannt, ob das was bringen wird mit dem nächsten Udpate. Die Font-Geschichte hab ich an Alaska geschickt, da bekomm ich dann hoffentlich kommende Woche eine Rückmeldung.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten