
Code: Alles auswählen
; PB 4.40 compatible GetFileVersion Function, use the PB "version.lib".
Import "version.lib"
CompilerIf #PB_Compiler_Unicode
GetFileVersionInfo(lptstrFilename.s,dwHandle.l,dwLen.l,*lpData) As "_GetFileVersionInfoW"
GetFileVersionInfoSize(lptstrFilename.s,*lpdwHandle) As "_GetFileVersionInfoSizeW"
VerQueryValue(pBlock,lpSubBlock.s,lplpBuffer,puLen) As "_VerQueryValueW"
CompilerElse
GetFileVersionInfo(lptstrFilename.s,dwHandle.l,dwLen.l,*lpData) As "_GetFileVersionInfoA"
GetFileVersionInfoSize(lptstrFilename.s,*lpdwHandle) As "_GetFileVersionInfoSizeA"
VerQueryValue(pBlock,lpSubBlock.s,lplpBuffer,puLen) As "_VerQueryValueA"
CompilerEndIf
EndImport
Enumeration
#GFVI_FileVersion = $0001
#GFVI_FileDescription = $0002
#GFVI_LegalCopyright = $0004
#GFVI_InternalName = $0008
#GFVI_OriginalFilename = $0010
#GFVI_ProductName = $0020
#GFVI_ProductVersion = $0040
#GFVI_CompanyName = $0080
#GFVI_LegalTrademarks = $0100
#GFVI_SpecialBuild = $0200
#GFVI_PrivateBuild = $0400
#GFVI_Comments = $0800
#GFVI_Language = $1000
#GFVI_All = $1FFF
EndEnumeration
Procedure.s GetElementNameInternal(elementKey.l)
If elementKey = #GFVI_FileVersion : ProcedureReturn "FileVersion"
ElseIf elementKey = #GFVI_FileDescription : ProcedureReturn "FileDescription"
ElseIf elementKey = #GFVI_LegalCopyright : ProcedureReturn "LegalCopyright"
ElseIf elementKey = #GFVI_InternalName : ProcedureReturn "InternalName"
ElseIf elementKey = #GFVI_OriginalFilename : ProcedureReturn "OriginalFilename"
ElseIf elementKey = #GFVI_ProductName : ProcedureReturn "ProductName"
ElseIf elementKey = #GFVI_ProductVersion : ProcedureReturn "ProductVersion"
ElseIf elementKey = #GFVI_CompanyName : ProcedureReturn "CompanyName"
ElseIf elementKey = #GFVI_LegalTrademarks : ProcedureReturn "LegalTrademarks"
ElseIf elementKey = #GFVI_SpecialBuild : ProcedureReturn "SpecialBuild"
ElseIf elementKey = #GFVI_PrivateBuild : ProcedureReturn "PrivateBuild"
ElseIf elementKey = #GFVI_Comments : ProcedureReturn "Comments"
ElseIf elementKey = #GFVI_Language : ProcedureReturn "Language"
EndIf
EndProcedure
Procedure.s GetFileVersion(lptstrFilename.s,Which,FieldName)
Protected lpdwHandle.i, dwLen.w, lplpBuffer.i, puLen.l, *lpData, lpSubBlock.s
Protected cchLang.l, szLang.s, bBit.b, lekFlag.l, sElement.s, sGFVI.s, CPLI.s
cchLang = 128 : szLang.s = Space(cchLang)
If FileSize(lptstrFilename) > 0
dwLen = GetFileVersionInfoSize(lptstrFilename,@lpdwHandle)
If dwLen > 0
*lpData = AllocateMemory(dwLen)
If *lpData > 0
If GetFileVersionInfo(lptstrFilename,0,dwLen,*lpData)
lpSubBlock.s = "\\VarFileInfo\\Translation"
If VerQueryValue(*lpData,lpSubBlock,@lplpBuffer,@puLen)
CPLI = RSet(Hex(PeekW(lplpBuffer)),4,"0")+RSet(Hex(PeekW(lplpBuffer+2)),4,"0")
VerLanguageName_(Str(PeekW(lplpBuffer)),szLang,cchLang)
EndIf
lekFlag = 1
For bBit = 1 To 12
If lekFlag & Which
sElement = GetElementNameInternal(lekFlag)
lpSubBlock = "\\StringFileInfo\\"+CPLI+"\\"+sElement
If VerQueryValue(*lpData,lpSubBlock,@lplpBuffer,@puLen)
If sGFVI<>"" : sGFVI+Chr(10) : EndIf
If FieldName
sGFVI=sGFVI+sElement+":"+Chr(9)+PeekS(lplpBuffer)
Else
sGFVI=sGFVI+PeekS(lplpBuffer)
EndIf
EndIf
EndIf
lekFlag << 1
Next
If lekFlag & Which
If sGFVI<>"" : sGFVI+Chr(10) : EndIf
If FieldName
sElement = GetElementNameInternal(lekFlag)
sGFVI = sGFVI+sElement+":"+Chr(9)+szLang
Else
sGFVI = sGFVI+szLang
EndIf
EndIf
EndIf
FreeMemory(*lpData)
EndIf
EndIf
EndIf
ProcedureReturn sGFVI
EndProcedure