Playing with this and decided to share with the community... Cut and paste code to test.pb in the C:\TEMP folder. Change the version info in Compiler/Compiler Options/Version Info. Create an executable test.exe and run the program. Change the values to suit your taste.
Code: Select all
Enumeration
#FVI_FileVersion = $0001
#FVI_FileDescription = $0002
#FVI_LegalCopyright = $0004
#FVI_InternalName = $0008
#FVI_OriginalFilename = $0010
#FVI_ProductName = $0020
#FVI_ProductVersion = $0040
#FVI_CompanyName = $0080
#FVI_LegalTrademarks = $0100
#FVI_SpecialBuild = $0200
#FVI_PrivateBuild = $0400
#FVI_Comments = $0800
#FVI_Language = $1000
#FVI_Email = $1001
#FVI_Website = $1002
#FVI_Special = $1003
EndEnumeration
Procedure.s GetFileVersionInfo_ElementName(ElementFlag)
Protected TempString$ = ""
Select ElementFlag
Case #FVI_FileVersion
TempString$ = "FileVersion"
Case #FVI_FileDescription
TempString$ = "FileDescription"
Case #FVI_LegalCopyright
TempString$ = "LegalCopyright"
Case #FVI_InternalName
TempString$ = "InternalName"
Case #FVI_OriginalFilename
TempString$ = "OriginalFilename"
Case #FVI_ProductName
TempString$ = "ProductName"
Case #FVI_ProductVersion
TempString$ = "ProductVersion"
Case #FVI_CompanyName
TempString$ = "CompanyName"
Case #FVI_LegalTrademarks
TempString$ = "LegalTrademarks"
Case #FVI_SpecialBuild
TempString$ = "SpecialBuild"
Case #FVI_PrivateBuild
TempString$ = "PrivateBuild"
Case #FVI_Comments
TempString$ = "Comments"
Case #FVI_Language
TempString$ = "Language"
Case #FVI_Email
TempString$ = "Email"
Case #FVI_Website
TempString$ = "Website"
Case #FVI_Special
TempString$ = "Special"
EndSelect
ProcedureReturn TempString$
EndProcedure
CompilerIf #PB_Compiler_Unicode
Prototype.l GetFileVersionInfoSizeW(lptstrFilename.p-unicode, lpdwHandle.l)
Prototype.l GetFileVersionInfoW(lptstrFilename.p-unicode, dwHandle.l, dwLen.l, lpData.l)
Prototype.l VerQueryValueW(pBlock.l, lpSubBlock.p-unicode, lplpBuffer.l, puLen.w)
Prototype.l VerLanguageNameW(wLang.l, szLang.p-unicode, cchLang.l)
CompilerElse
Prototype.l GetFileVersionInfoSizeA(lptstrFilename.p-ascii, lpdwHandle.l)
Prototype.l GetFileVersionInfoA(lptstrFilename.p-ascii, dwHandle.l, dwLen.l, lpData.l)
Prototype.l VerQueryValueA(pBlock.l, lpSubBlock.p-ascii, lplpBuffer.l, puLen.w)
Prototype.l VerLanguageNameA(wLang.l, szLang.p-ascii, cchLang.l)
CompilerEndIf
Procedure.s GetFileVersionInfoString(lptstrFilename$, FVI_Flag)
Protected TempString$ = "", TempPtr, TempBlkSize, *TempBlk
Protected TempLibHandle, TempBuff, TempBuffSize, TempCPLI$, TempLangSize = 128, TempLang$ = Space(TempLangSize)
If FileSize(lptstrFilename$) >= 0
TempLibHandle = OpenLibrary(#PB_Any, "version.dll")
If TempLibHandle
CompilerIf #PB_Compiler_Unicode
GetFileVersionInfoSize.GetFileVersionInfoSizeW = GetFunction(TempLibHandle, "GetFileVersionInfoSizeW")
GetFileVersionInfo.GetFileVersionInfoW = GetFunction(TempLibHandle, "GetFileVersionInfoW")
VerQueryValue.VerQueryValueW = GetFunction(TempLibHandle, "VerQueryValueW")
VerLanguageName.VerLanguageNameW = GetFunction(TempLibHandle, "VerLanguageNameW")
CompilerElse
GetFileVersionInfoSize.GetFileVersionInfoSizeA = GetFunction(TempLibHandle, "GetFileVersionInfoSizeA")
GetFileVersionInfo.GetFileVersionInfoA = GetFunction(TempLibHandle, "GetFileVersionInfoA")
VerQueryValue.VerQueryValueA = GetFunction(TempLibHandle, "VerQueryValueA")
VerLanguageName.VerLanguageNameA = GetFunction(TempLibHandle, "VerLanguageNameA")
CompilerEndIf
TempBlkSize = GetFileVersionInfoSize(lptstrFilename$, @TempPtr)
If TempBlkSize > 0
*TempBlk = AllocateMemory(TempBlkSize)
If *TempBlk > 0
If GetFileVersionInfo(lptstrFilename$, 0, TempBlkSize, *TempBlk)
If VerQueryValue(*TempBlk, "\\VarFileInfo\\Translation", @TempBuff, @TempBuffSize)
TempCPLI$ = RSet(Hex(PeekW(TempBuff)), 4, "0") + RSet(Hex(PeekW(TempBuff + 2)), 4, "0")
VerLanguageName(PeekW(TempBuff), TempLang$, TempLangSize)
EndIf
If VerQueryValue(*TempBlk, "\\StringFileInfo\\" + TempCPLI$ + "\\" + GetFileVersionInfo_ElementName(FVI_Flag), @TempBuff, @TempBuffSize)
TempString$ = PeekS(TempBuff, TempBuffSize)
EndIf
If FVI_Flag = #FVI_Language
TempString$ = TempLang$
EndIf
EndIf
EndIf
FreeMemory(*TempBlk)
EndIf
EndIf
CloseLibrary(TempLibHandle)
EndIf
ProcedureReturn(TempString$)
EndProcedure
File$ = "c:\temp\test.exe"
Debug GetFileVersionInfo_ElementName(#FVI_FileVersion) + " : " + GetFileVersionInfoString(File$, #FVI_FileVersion)
Debug GetFileVersionInfo_ElementName(#FVI_FileDescription) + " : " + GetFileVersionInfoString(File$, #FVI_FileDescription)
Debug GetFileVersionInfo_ElementName(#FVI_LegalCopyright) + " : " + GetFileVersionInfoString(File$, #FVI_LegalCopyright)
Debug GetFileVersionInfo_ElementName(#FVI_InternalName) + " : " + GetFileVersionInfoString(File$, #FVI_InternalName)
Debug GetFileVersionInfo_ElementName(#FVI_OriginalFilename) + " : " + GetFileVersionInfoString(File$, #FVI_OriginalFilename)
Debug GetFileVersionInfo_ElementName(#FVI_ProductName) + " : " + GetFileVersionInfoString(File$, #FVI_ProductName)
Debug GetFileVersionInfo_ElementName(#FVI_ProductVersion) + " : " + GetFileVersionInfoString(File$, #FVI_ProductVersion)
Debug GetFileVersionInfo_ElementName(#FVI_CompanyName) + " : " + GetFileVersionInfoString(File$, #FVI_CompanyName)
Debug GetFileVersionInfo_ElementName(#FVI_LegalTrademarks) + " : " + GetFileVersionInfoString(File$, #FVI_LegalTrademarks)
Debug GetFileVersionInfo_ElementName(#FVI_SpecialBuild) + " : " + GetFileVersionInfoString(File$, #FVI_SpecialBuild)
Debug GetFileVersionInfo_ElementName(#FVI_PrivateBuild) + " : " + GetFileVersionInfoString(File$, #FVI_PrivateBuild)
Debug GetFileVersionInfo_ElementName(#FVI_Comments) + " : " + GetFileVersionInfoString(File$, #FVI_Comments)
Debug GetFileVersionInfo_ElementName(#FVI_Language) + " : " + GetFileVersionInfoString(File$, #FVI_Language)
For x = 0 To $1100
y$ = Trim(GetFileVersionInfoString(File$, x))
If y$ <> ""
Debug Hex(x) + " " + GetFileVersionInfo_ElementName(x) + " : " + GetFileVersionInfoString(File$, x)
EndIf
Next
Debug "end"
; IDE Options = PureBasic 4.41 (Windows - x86)
; CursorPosition = 132
; FirstLine = 103
; Folding = -
; EnableXP
; Executable = Test.exe
; IncludeVersionInfo
; VersionField0 = 1.0.0.0
; VersionField1 = 0.0.0.1
; VersionField2 = My Company
; VersionField3 = My Product
; VersionField4 = 2010
; VersionField5 = File Version
; VersionField6 = File Description
; VersionField7 = What is internal
; VersionField8 = Original Fries
; VersionField9 = © Copyright
; VersionField10 = ™ Trademark
; VersionField11 = PB 4.41
; VersionField12 = x86
; VersionField13 = nobody@nowhere.com
; VersionField14 = www.nowhere.com
; VersionField15 = VOS_NT_WINDOWS32
; VersionField16 = VFT_APP
; VersionField17 = 0800 System Default Language
; VersionField18 = Comments
; VersionField19 = Special
; VersionField21 = Additional Comments
; VersionField22 = Additional Special Field