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
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
Dim x As New Scripting.FileSystemObject
VBA.MsgBox x.GetFileVersion("\..\xx.dll")
Public Const Syn_kg = " "