How to read unkown inofficial FileVersionInfo entries?

Just starting out? Need help? Post your questions and find answers here.
BigJack
User
User
Posts: 76
Joined: Tue May 16, 2006 6:46 am
Location: Germany
Contact:

How to read unkown inofficial FileVersionInfo entries?

Post by BigJack »

Hi all,
I wonder how I can manage to read unknown inofficial entries and their associated values from a FileVersionInfo resource in exe or dll files?
For Instance: If an entrie is named "Forum" and its value a corresponding website, how can I get it?
I know how to read out all known official entries like CompanyName, FileVersion, ProductVersion, ProductName etc...
Thanks.
Greetings to all the folks back home in the States...
PB4.2 Windows XP SP3
BigJack
User
User
Posts: 76
Joined: Tue May 16, 2006 6:46 am
Location: Germany
Contact:

Post by BigJack »

Here is a code I created to get all VersionInfo Values from a file:
(May not be the most elegant way - but it works...)

Code: Select all

;=====================================================================
;Test Version for reading out FileVersionInfo Block
;Special: Read out ALL Information that is contained in the InfoBlock
;not just the official values - all languages
;---------------------------------------------------------------------
;Date: March 17th 2007 - Beta Version - stillt needs to be tested.
;Author: Mike Doran
;Written in PB 4.02 / Windows XP Pro SP2
;=====================================================================


Procedure.s GetVersionInfo (File$, Getinfo$) 
    info$="" 
    If FileSize (File$) > 0 
        zero = 10 
        If OpenLibrary (1, "version.dll") 
            length = CallFunction (1, "GetFileVersionInfoSizeA", File$, @zero) 
            If length 
                *mem1 = AllocateMemory (length) 
                If *mem1 
                    result = CallFunction (1, "GetFileVersionInfoA", File$, 0, length, *mem1) 
                    If result
                    
                    	
                    	lpSubBlock$ = "\\VarFileInfo\\Translation" 
            					Result1      = CallFunction(1,"VerQueryValueA",*mem1,lpSubBlock$,@lplpBuffer,@puLen) 
            					If Result1 
              					CPLI$  = RSet(Hex(PeekW(lplpBuffer)),4,"0")+RSet(Hex(PeekW(lplpBuffer+2)),4,"0") 
              					;MessageRequester("Info",CPLI$,0)   ; LanguageCode ID
              					Result1 = CallFunction(1,"VerLanguageNameA",PeekW(lplpBuffer),@szLang$,nSize) 
            					EndIf 
                    
                    
                        infobuffer = 0 
                        infolen = 0 
                        ;Language must be specified in order to work: !!!
                        getinfo$ = "\\StringFileInfo\\"+CPLI$+"\\" + getinfo$ 
                        result = CallFunction (1, "VerQueryValueA", *mem1, getinfo$, @infobuffer, @infolen) 
                        If result 
                            info$ = PeekS(infobuffer) 
                        EndIf 
                    EndIf 
                    FreeMemory (*mem1) 
                EndIf 
            EndIf 
            CloseLibrary (1) 
        EndIf 
    EndIf  
ProcedureReturn info$ 
EndProcedure 




;-========= Select File =======================
SelectFile:
SelectFile$ = OpenFileRequester("Select File", "", "Exe (*.exe;*.dll)|*.exe;*.dll|", 0)
If SelectFile$
  FileName$ = SelectFile$
Else
  End  
EndIf  


;-===== Reading FileVesionInfo Block =======
ItemCount = 0 ;Needed for formating / to see how many strings were found in the search
InitFlag = 0
If FileSize(Filename$)>0 
    If OpenLibrary(1,"Version.dll") 
      dwLen = CallFunction(1,"GetFileVersionInfoSizeA",Filename$,@lpdwHandle) 
      ;SetGadgetText(#String_55,StrU(dwLen,#Word))
      If dwLen>0 ; Length of FileVersionInfoBlock must be greater than zero
        *pBlock=AllocateMemory(dwLen) ;Allocate buffer memory for FileVersionInfoBlock
        If *pBlock>0 
          Result = CallFunction(1,"GetFileVersionInfoA",Filename$,0,dwLen,*pBlock) 
          If Result ; if successful continue and start the search
          	Gesamt$ = ""
          	BCount = 0
          	;----- Begin Loop Length of VersionInfoBlock --------
          	For I = 0 To dwLen-1 
          		Byte.C = PeekC(*pBlock+I)
          		If Byte = 0
          		  
          			BCount +1
          			
          			If BCount >2  ;Two consecutive ZeroBytes = StringEnd ------------
          				          				
          				If Len(AddString$)>1
          					;----- End VersionInfoBlock ----
          					If AddString$ = "VarFileInfo" ; Detecting End of InfoBlock
          						Break
          					;---- Begin VersionInfoBlock ---- 
          					ElseIf AddString$ = "StringFileInfo" ; Detect Start of FileInfo
          						Gesamt$ = ""  ;Begin of FileVersionBlock
          						ItemCount = 0:InitFlag =1
          					Else
          					  Gesamt$+AddString$+Chr(10) ; Adding FoundString to Gesamt$
          					  If InitFlag
          					    ItemCount+1 ; Increase found string counter by 1 after new string found
          					    Even +1
          					    ;MessageRequester("ItemCount",Str(Itemcount)+" - "+Addstring$,0)
          					  EndIf  
          					EndIf
          					
          					AddString$ = "" ; resetting ADDString after its been added to Gesamt$
          					BCount = 0    ; Resetting ZeroByte Counter
          				Else
          					
          					AddString$ = "" ;Resetting AddString when length was smaller than 1
          					BCount = 0	  ; Resetting ZeroByte Counter
          				EndIf	
          			EndIf
          		ElseIf Byte <32 And Byte > 0 ;Allow only valid characters in AddString
          			AddString$ = ""; Resetting AddString after invalid Character found
          			BCount=0     ;Resetting ZeroByte Counter
          		Else
          		  AddString$ +Chr(Byte) ;Adding character to AddString
          			BCount = 0           ; Resetting ZeroByte counter
          		EndIf
          	Next I ;========Loop End ===================
         	
          EndIf	
        FreeMemory(*pBlock) ; Free allocated memory block
        EndIf
      EndIf 
    CloseLibrary(1)
    EndIf      	
EndIf


;-==== Formating Output-String - Showing Result in Total$ =========
Total$ = ""
For i = 2 To Itemcount ;Step 2
  Field$ = StringField(Gesamt$,I,Chr(10))
  If Field$
    Value$ = GetVersionInfo(FileName$, Field$)
    If Len(Value$) >0
      Add$ =Field$+": "+Value$
      If Not FindString(Total$,Add$,1)
        Total$+Field$+": "+Value$+Chr(10)
      EndIf
    EndIf  
  EndIf
Next i

MessageRequester("Info","Version Info:"+Chr(10)+"========"+Chr(10)+Total$,0)

Greetings to all the folks back home in the States...
PB4.2 Windows XP SP3
Hkb
New User
New User
Posts: 6
Joined: Sun Sep 25, 2005 8:13 pm
Location: Sweden

Post by Hkb »

Hi!

Is it possible to change fileinfo in an open file?
What I like to do is to save data in the fileinfo instead of using a separate file or reg key.

Kind Regards
Post Reply