FileVersion
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
FileVersion
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: FileVersion
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.
Die ist wohl schon einige Jahre alt, funktioniert aber immer.
Gruss Carlo
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
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: FileVersion
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: FileVersion
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
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
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: FileVersion
... ich bin froh, das ich die ot4xb bei mir überall raus habe. Da werd ich die dafür nicht wieder rein nehmen.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: FileVersion
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.
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
Jimmy
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: FileVersion
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: FileVersion
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 freigibtist 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 !
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
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
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: FileVersion
Hallo Jan
die Zeile:
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
die Zeile:
Code: Alles auswählen
#include "dll.ch"
aVersion := LoadResource(1, XPP_MOD_EXE, RES_VERSION)
soeben getestet mit der Version 2.00.1068
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: FileVersion
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.
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
Tom
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: FileVersion
Hallo Carlo,
das klappt ganz hervorragend! Vielen Dank für das Sample.
Jan
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: FileVersion
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:
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
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()
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.