Option ExplicitPrivate Declare Function GetFileVersionInfo Lib "version.dll" Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal dwHandle As Long, ByVal dwLen As Long, lpData As Any) As Long
Private Declare Function GetFileVersionInfoSize Lib "version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
Private Declare Function VerQueryValue Lib "version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
Private Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (dest As Any, ByVal Source As Long, ByVal Length As Long)
Private Declare Function lstrcpy Lib "Kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Public Declare Function VerLanguageName Lib "Kernel32" Alias "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, ByVal nSize As Long) As LongPublic Function GetFileVerInfo(FullFileName As String) As String()
    Dim rc As Long, lDummy As Long, sBuffer() As Byte
    Dim lBufferLen As Long, lVerPointer As Long
    Dim bytebuffer(260) As Byte
    Dim Lang_Charset_String As String
    Dim HexNumber As Long, Buffer As String
    Dim i As Integer, strtemp As String
    Dim strFileVer(5) As String   For i = 0 To 5
    strFileVer(i) = "" '"No Version Info available!"
   Next
   '*** Get size ****
   lBufferLen = GetFileVersionInfoSize(FullFileName, lDummy)
   If lBufferLen < 1 Then
      GetFileVerInfo = strFileVer
      Exit Function
   End If   '**** Store info to udtVerBuffer struct ****
   ReDim sBuffer(lBufferLen)
   rc = GetFileVersionInfo(FullFileName, 0&, lBufferLen, sBuffer(0))
        If rc = 0 Then
            GetFileVerInfo = strFileVer
            Exit Function '"No Version Info available!"
        End If
   rc = VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", lVerPointer, lBufferLen)
        If rc = 0 Then
            GetFileVerInfo = strFileVer
            Exit Function '"No Version Info available!"
        End If
        
        
    strFileVer(2) = "CompanyName"
    strFileVer(4) = "FileDescription"
    strFileVer(0) = "FileVersion"
    strFileVer(1) = "InternalName"
    strFileVer(3) = "LegalCopyright"
        MoveMemory bytebuffer(0), lVerPointer, lBufferLen
    HexNumber = bytebuffer(2) + bytebuffer(3) * &H100 + bytebuffer(0) * &H10000 + bytebuffer(1) * &H1000000
    rc = CLng(bytebuffer(0) + bytebuffer(1) * &H100)
    Lang_Charset_String = Hex(HexNumber)
    
    
    Do While Len(Lang_Charset_String) < 8
        Lang_Charset_String = "0" & Lang_Charset_String
    Loop
    
    strtemp = String(260, Asc(Syn_kg))
    rc = VerLanguageName(rc, strtemp, CLng(255))
    strFileVer(5) = StripTerminator(strtemp)
   
    strtemp = ""
    For i = 0 To 4
        Buffer = String(260, Asc(Syn_kg))
        strtemp = "\StringFileInfo\" & Lang_Charset_String & Syn_pzh & strFileVer(i)
        rc = VerQueryValue(sBuffer(0), strtemp, lVerPointer, lBufferLen)
        If rc <> 0 Then
            lstrcpy Buffer, lVerPointer
            Buffer = StripTerminator(Buffer)
        Else
            Buffer = ""
        End If
        strFileVer(i) = Buffer
    Next i
 GetFileVerInfo = strFileVer
End Function
Public Function StripTerminator(ByVal sInput As String) As String
    Dim ZeroPos As Integer
    ZeroPos = InStr(1, sInput, vbNullChar)
    If ZeroPos > 0 Then
        StripTerminator = Left$(sInput, ZeroPos - 1)
    Else
        StripTerminator = sInput
    End If
End Function