Функция VerQueryValue

Declare Function VerQueryValue Lib "version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Long, puLen As Long) As Long
VerQueryValue извлекает информацию из ресурса версии. Перед вызовом этой функции необходимо сначала вызвать функции GetFileVersionInfoSize и GetFileVersionInfo

Возвращаемое значение

В успешном случае возвращается ненулевое значение. Если требуемая информация не существует или pBlock не содержит правильных данных, то возвращается 0

Парметры

pBlock
Указатель на буфер, содержащий информацию о версии, полученную функцией GetFileVersionInfo
lpSubBlock
Одна из следующих строк, определяющих тип информации
"\"Извлекает корневой блок информации о версии при помощи структуры 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"
lplpBuffer
Указатель на данные, извлеченные из ресурса версии
puLen
Размер данных lplpBuffer в байтах

Пример

' Выводим информацию о версии файла
' Добавьте на форму список 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

Смотри также

GetFileVersionInfo, GetFileVersionInfoSize

Категория

Информация о версии