The Sparkie's code does not seem to work on a XP SP2 with English kernel and French interface.
I changed 040904B0 by 040904E4 and it works fine!
Some explanation about 040904E4:
04 : SUBLANG_ENGLISH_USA
09 : LANG_ENGLISH
04E4 : 1252 in dec = Codepage for Windows:Multilingual
Found on
http://www.vbfrance.com/code.aspx?id=26103
(in French)
In this Web page, it is question to use VerQueryValue first with "\VarFileInfo\Translation" parameter, to obtain this famous 040904E4, and then use it in the others VerQueryValue as in Sparkie's code.
But I am not able to translate 4 bytes in memory (8987036 (dec) = result of the VerQueryValue with "\VarFileInfo\Translation") into a string with hexadecimal representation ("040904E4") usable in the following VerQueryValues.
I need it, because I must use my program on several PC with different languages.
Here my code.
Thanks for any help...
Jean.
Code: Select all
;GetFileVersionInfo for Purebasic ;Gets the Info from a DLL (If you want to write your own installer FPRIVATE "TYPE=PICT;ALT=icon_smile.gif"
;(c)2002 By Siegfried Rings (CodeGuru)
; ************************************************************
; ************ Edited by Sparkie January 11, 2004 ************
; ************ Now works with PB 3.92 ************************
; ************************************************************
; Changed Line 24: Mem1=AllocateMemory(1,Length,0)
; To: *Mem1=AllocateMemory(Length)
; ************************************************************
; Changed: all Mem1 references
; To: *Mem1
; ************************************************************
; Changed Line 80: FreeMemory(1)
; To: FreeMemory(*Mem1)
; ************************************************************
Procedure.s get_lang_char_string(wh_version_dll,*Mem1)
result$ = ""
; result$ = "040904E4" = hexadecimal representation written in a string
; 04------ = SUBLANG_ENGLISH_USA
; --09---- = LANG_ENGLISH
; ----04E4 = 1252 = Codepage For Windows:Multilingual
lplpBuffer.l=0
puLen.l=0
WhichOne.s="\\VarFileInfo\\Translation"
Res = CallFunction(wh_version_dll, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
; lplpBuffer.l contains 4 bytes.
; the first 2 bytes contain 1033 (= in hexa 0409 = SUBLANG_ENGLISH_USA LANG_ENGLISH )
; the last 2 bytes contain 1252 (= in hexa 04E4 = Codepage for Windows Multilingual)
; we have to translate it into a string representing hexadecimal value.
; (if I understand well)
; I am not able to find the good method to obtain "040904E4"
; from @lplpBuffer (which contains 8987036 in dec)
result$ = "040904E4"
ProcedureReturn result$
EndProcedure
Procedure.s GetVersionInfo(Filename.s)
sDummy.s=""
If FileSize(Filename.s)>0
Zero.l=10
If OpenLibrary(1,"Version.dll")
Length = CallFunction(1, "GetFileVersionInfoSizeA",Filename.s,@Zero.l)
If Length>0
*Mem1=AllocateMemory(Length)
If *Mem1>0
Result = CallFunction(1, "GetFileVersionInfoA",Filename.s,0,Length,*Mem1)
If Result>0
lplpBuffer.l=0
puLen.l=0
lang_char_string.s = get_lang_char_string(1,*Mem1)
If lang_char_string.s <> ""
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\ProductVersion" ;
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s="Productversion="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\ProductName"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"ProductName="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\CompanyName"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"CompanyName="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\LegalCopyright"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"LegalCopyright="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\Comments"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"Comments="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\FileDescription"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"FileDescription="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\FileVersion"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"FileVersion="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\InternalName"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"InternalName="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\LegalTrademarks"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"LegalTrademarks="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\PrivateBuild"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"PrivateBuild="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\SpecialBuild"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"SpecialBuild="+PeekS(lplpBuffer): EndIf
WhichOne.s="\\StringFileInfo\\" + lang_char_string.s + "\\Language"
Result = CallFunction(1, "VerQueryValueA",*Mem1,WhichOne.s,@lplpBuffer,@puLen)
If Result:sDummy.s=sDummy.s + Chr(10) +"Language="+PeekS(lplpBuffer): EndIf
EndIf
EndIf
FreeMemory(*Mem1)
EndIf
EndIf
CloseLibrary(1)
EndIf
Else
sDummy.s=Filename +" Not found !"
EndIf
ProcedureReturn sDummy.s
EndProcedure
Filename.s="C:\Program Files\Microsoft Office\Office\Excel.exe"
Filename.s="C:\Program Files\Symantec AntiVirus\vptray.exe" ;Check your File !
MessageRequester("Fileinfo for "+Filename.s,GetVersionInfo(Filename),0)
End
PureBasic 6.20 beta 2 (x64) | Windows 10 Pro x64 | Intel(R) Core(TM) i7-8700 CPU @ 3.20Ghz 16 GB RAM, SSD 500 GB, PC locally assembled.
Come back to 6.11 LTS 64 bits because of an issue with #PB_ComboBox_UpperCase in ComboBoxGadget() (Oct. 10, 2024).