Подскажите как получить из исполняемого файла типа exe, dll ресурс "Version Info"
Вот файл для теста в архиве.
ResHacker отображает такую информацию и мне её нужно получить:
Пытался получить так, но не получается:
Функцию FileGetVersion не предлагать - она работает криво.
.
Цель всего этого конечно одна - это получить данные файла, стал копать глубже и выяснилось что есть проблема в функциях: FileGetVersion() и _WinAPI_VerQueryValue()
А всё из-за того, что код языка не совпадает: в строке VALUE "Translation", 0x0419 0x04E4 написан код 041904E4, а реальные данные находятся в другом блоке: BLOCK "040904E4"
Поэтому функция _WinAPI_VerQueryValue() работает не правильно, она обращается в
и получает не тот код языка.
Наткнулся на ряд статей, которые обходят эту проблему,вот одна из них - там приведён код на ассемблере с комментариями, но я так и не смог его переложить на Autoit, а именно этот кусок:
Есть пример из справки:
После функции _WinAPI_GetFileVersionInfo() у нас есть: $iSize - размер ресурса "VERSION" и $pData - указатель на буфер.
Как получить реальный код языка?
Возможно кто-то имеет больше опыта чтения информации из указателя на буфер.
Жаль, что ответа пока нет.
Но вопрос остаётся актуальным, т.к. каждый из Вас может столкнуться с тем, что FileGetVersion() не возвращает точные данные, таких файлов не один и ни два - их тысячи (сейчас занимаюсь определением файлов по содержимому и это очевидно)
Производя поиск по сайтам, увидел (вспомнил), что уже поднимал подобную тему 8 лет назад , тогда и в голову не могло прийти, что это из-за проблем определения языка..., но за 8 лет вопрос не решился.
Раз тут никто не может помочь, у меня просьба к тем, кто знает английский язык и помочь создать эту тему на официальном форуме.
Заранее спасибо!
Вот файл для теста в архиве.
ResHacker отображает такую информацию и мне её нужно получить:
Код:
1 VERSIONINFO
FILEVERSION 10,0,0,5175
PRODUCTVERSION 10,0,2411,0
FILEOS 0x4
FILETYPE 0x2
{
BLOCK "StringFileInfo"
{
BLOCK "040904E4"
{
VALUE "CompanyName", "Microsoft Corporation"
VALUE "FileDescription", "Office10"
VALUE "FileVersion", "10.0.5175"
VALUE "InternalName", "mstore10"
VALUE "LegalCopyright", "Copyright© Microsoft Corporation 1983-2001. All rights reserved."
VALUE "LegalTrademarks1", "Microsoft® is a registered trademark of Microsoft Corporation."
VALUE "LegalTrademarks2", "Windows® is a registered trademark of Microsoft Corporation."
VALUE "OriginalFilename", "Office10.MMW"
VALUE "ProductName", "Microsoft Clip Organizer"
VALUE "ProductVersion", "10.0.2411.0"
VALUE "Built by", "MediaStoreDB"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0419 0x04E4
}
}
Пытался получить так, но не получается:
Код:
#include <resources.au3>
$sFile='D:\test\xxxxx'
$string = _ResourceGetAsStringW("VERSIONINFO",16,1033,$sFile)
MsgBox(4096,'Переменная $string',$string)
Функцию FileGetVersion не предлагать - она работает криво.
.
Сообщение автоматически объединено:
Цель всего этого конечно одна - это получить данные файла, стал копать глубже и выяснилось что есть проблема в функциях: FileGetVersion() и _WinAPI_VerQueryValue()
А всё из-за того, что код языка не совпадает: в строке VALUE "Translation", 0x0419 0x04E4 написан код 041904E4, а реальные данные находятся в другом блоке: BLOCK "040904E4"
Поэтому функция _WinAPI_VerQueryValue() работает не правильно, она обращается в
Код:
DllCall('version.dll', 'bool', 'VerQueryValueW', 'ptr', $pData, 'wstr', '\VarFileInfo\Translation', 'ptr*', 0, 'uint*', 0)
и получает не тот код языка.
Наткнулся на ряд статей, которые обходят эту проблему,вот одна из них - там приведён код на ассемблере с комментариями, но я так и не смог его переложить на Autoit, а именно этот кусок:
Код:
;// Не рабочий метод получения Lang/CodePage
;// лучше гарантированно вытащить их семью строками ниже
;// invoke VerQueryValue,verData,<'\VarFileInfo\Translation',0>,lpBuff,lpLen
;// Здесь нужно взять из буфера "язык и кодировку" (unicode),
;// чтобы передать их в функцию VerQueryValue() как ANSI.
mov esi,verData ;// начало данных
add esi,0x86 ;// +86h = адрес Lang/CP (источник)
mov edi,cp ;// приёмник для конкатенации строк
mov ecx,8 ;// длина Unicode-строки
@@: lodsw ;// взять 2-байта
stosb ;// сохранить 1 младший
loop @b ;// повторить ECX-раз..
Есть пример из справки:
Код:
#include <Array.au3>
#include <WinAPIMem.au3>
#include <WinAPIRes.au3>
$sFile='D:\test\xxxxx'
Local $pData = 0, $iSize = _WinAPI_GetFileVersionInfo($sFile, $pData,1)
If Not $iSize Then Exit
Local $aData = _WinAPI_VerQueryValue($pData)
_ArrayDisplay($aData, '_WinAPI_VerQueryValue')
_WinAPI_FreeMemory($pData)
После функции _WinAPI_GetFileVersionInfo() у нас есть: $iSize - размер ресурса "VERSION" и $pData - указатель на буфер.
Как получить реальный код языка?
Возможно кто-то имеет больше опыта чтения информации из указателя на буфер.
Сообщение автоматически объединено:
Жаль, что ответа пока нет.
Но вопрос остаётся актуальным, т.к. каждый из Вас может столкнуться с тем, что FileGetVersion() не возвращает точные данные, таких файлов не один и ни два - их тысячи (сейчас занимаюсь определением файлов по содержимому и это очевидно)
Производя поиск по сайтам, увидел (вспомнил), что уже поднимал подобную тему 8 лет назад , тогда и в голову не могло прийти, что это из-за проблем определения языка..., но за 8 лет вопрос не решился.
Раз тут никто не может помочь, у меня просьба к тем, кто знает английский язык и помочь создать эту тему на официальном форуме.
Заранее спасибо!
Последнее редактирование: