Declare Function VerQueryValue Lib "version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Long, puLen As Long) As Long
В успешном случае возвращается ненулевое значение. Если требуемая информация не существует или pBlock не содержит правильных данных, то возвращается 0
"\" | Извлекает корневой блок информации о версии при помощи структуры VS_FIXEDFILEINFO |
"\VarFileInfo\Translation" | Извлекает идентификатор языка и кодовую страницу |
"\StringFileInfo\lang-codepage\string-name" | Извлекает различные значения: lang-codepage - 8-символьное шестнадцатиричное значение в строковом представлении, опрелеляющее кодовую страницу и идентификатор языка. string-name - одно из значений, определяющих возможные доступные строки: "Comments" "CompanyName" "FileDescription" "FileVersion" "InternalName" "LegalCopyright" "LegalTrademarks" "OriginalFilename" "PrivateBuild" "ProductName" "ProductVersion" "SpecialBuild" |
' Выводим информацию о версии файла ' Добавьте на форму список List1 ' При декларации функции MoveMemory используйте ByVal Source As Long Dim Buffer As String Dim rc As Long Dim FullFileName As String ' полное имя файла FullFileName = "c:\windows\notepad.exe" Dim lBufferLen As Long, lDummy As Long ' Получим размер хранимой информации lBufferLen = GetFileVersionInfoSize(FullFileName, lDummy) If lBufferLen < 1 Then MsgBox "Информация не доступна!" Exit Sub End If Dim sBuffer() As Byte ReDim sBuffer(lBufferLen) rc = GetFileVersionInfo(FullFileName, 0&, lBufferLen, sBuffer(0)) If rc = 0 Then MsgBox "Ошибка при вызове функции" Exit Sub End If Dim lVerPointer As Long rc = VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", lVerPointer, lBufferLen) If rc = 0 Then MsgBox "Ошибка при вызове функции" Exit Sub End If 'lVerPointer - указатель на 4-байтное шестнадцатиричное число, ' первые два байта - языковой идентификатор, последние два байта - кодовая страница Dim bytebuffer(255) As Byte MoveMemory bytebuffer(0), lVerPointer, lBufferLen Dim Lang_Charset_String As String Dim HexNumber As Long HexNumber = bytebuffer(2) + bytebuffer(3) * &H100 + bytebuffer(0) * &H10000 + bytebuffer(1) * &H1000000 Lang_Charset_String = Hex(HexNumber) ' Меняем порядок байтов ' и конвертируем в строку ' Например, выражение 040904E4 преобразуем так '04------ = SUBLANG_ENGLISH_USA '--09---- = LANG_ENGLISH ' ----04E4 = 1252 = Codepage for Windows:Multilingual Do While Len(Lang_Charset_String) < 8 Lang_Charset_String = "0" & Lang_Charset_String Loop List1.Clear Dim strVersionInfo(7) As String strVersionInfo(0) = "CompanyName" strVersionInfo(1) = "FileDescription" strVersionInfo(2) = "FileVersion" strVersionInfo(3) = "InternalName" strVersionInfo(4) = "LegalCopyright" strVersionInfo(5) = "OriginalFileName" strVersionInfo(6) = "ProductName" strVersionInfo(7) = "ProductVersion" Dim i As Integer Dim strTemp As String For i = 0 To 7 Buffer = String(255, 0) strTemp = "\StringFileInfo\" & Lang_Charset_String _ & "\" & strVersionInfo(i) rc = VerQueryValue(sBuffer(0), strTemp, _ lVerPointer, lBufferLen) If rc = 0 Then MsgBox "Ошибка на строке" & i Exit Sub End If lstrcpy Buffer, lVerPointer Buffer = Mid$(Buffer, 1, InStr(Buffer, Chr(0)) - 1) List1.AddItem strVersionInfo(i) & ": " & Buffer Next i