Сейчас на форуме: ManHunter, rmn, _MBK_, tyns777, UniSoft (+10 невидимых)

 eXeL@B —› Программирование —› Как программно определить версию exe-файла и версию компилятора на Delphi или С++
Посл.ответ Сообщение

Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 02 мая 2012 20:32
· Личное сообщение · #1

К примеру надо открыть файл C:\Windows\explorer.exe ,считать его версию 6.0.6002.18005
И определить что программа написана скажем на Visual C++ 2005



Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 02 мая 2012 20:35
· Личное сообщение · #2

Или вообще выдрать всю информацию из ехе-шника:
Описание файла
Тип
Версия
Название продукта

В Гугле есть только старые исходники,позволяющие определять тип PE 16\32 бита и всё или тупо по сигнатуре MZ



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 02 мая 2012 20:41 · Поправил: tihiy_grom
· Личное сообщение · #3

ГУГЛЯ в помощь

вот ещё по теме




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 02 мая 2012 20:53
· Личное сообщение · #4

с помощью сигнатур. для каких целей это нужно?

-----
[nice coder and reverser]




Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 02 мая 2012 21:01
· Личное сообщение · #5

С сигнатурами всё ясно,вернее ясно что дело это малоперспективное - учитывая из соседней темы новый файл userdb.txt к PEId с новыми сигнатурами. Половину имеющихся exe-шников у меня определяются как
yoda's Protector v1.02 (.dll,.ocx) --> Ashkbiz Danehkar *
Вместо VisualC++ надо полагать.

Начнем с простого - с выдирания из ехе основной информации о версии и названии продукта.



Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 02 мая 2012 21:04
· Личное сообщение · #6

Hellspawn пишет:
для каких целей это нужно?

Программа,определяющая какая в компьютере установлена операционная система и версии основных программ например MS Office. Реализовать это нужно именно через файлы,а не реестр т.к. там часто указана неверная информация или не указано что пакет уже удален



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 02 мая 2012 21:18
· Личное сообщение · #7

Svinovod пишет:
Половину имеющихся exe-шников у меня определяются как
yoda's Protector v1.02 (.dll,.ocx) --> Ashkbiz Danehkar *

Ну так удали эту сигнатуру.
Универсальных способов(кроме как сигнатурных) которые показывали бы компилятор, версию компилятора, систему на которой компилировали и т.д. не существует, т.к. этой информации в exe просто нету.
Что касаемо версии файла, то версия лежит в ресурсах, написать простенький извлекатель версии в 5-10 строк кода, минутное дело, да и примеров как грязи.



Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 02 мая 2012 21:27
· Личное сообщение · #8

Vovan666 пишет:
Ну так удали эту сигнатуру.

Да,так ещё куда бы ни шло: Visual C++ 2005 Release -> Microsoft *
Vovan666 пишет:
да и примеров как грязи

Может я слепой,но половину Яндекса перерыл - нет ничего



Ранг: 17.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 02 мая 2012 21:27
· Личное сообщение · #9

Svinovod пишет:
К примеру надо открыть файл C:\Windows\explorer.exe ,считать его версию 6.0.6002.18005

У себя для программного определения версии exe-файла использовал GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue.



Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 02 мая 2012 21:30 · Поправил: Svinovod
· Личное сообщение · #10

Vovan666 пишет:
Универсальных способов(кроме как сигнатурных) которые показывали бы компилятор, версию компилятора, систему на которой компилировали и т.д. не существует, т.к. этой информации в exe просто нету.

Для VisualC++ можно определить. Например по используемой версии vc_redist, ещё я опытным путем установил что проги на VisualC++ 2010 не работают по Win2K



Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 03 мая 2012 13:31 · Поправил: gloomdemon
· Личное сообщение · #11

Svinovod пишет:
ещё я опытным путем установил что проги на VisualC++ 2010 не работают по Win2K


http://stackoverflow.com/questions/2484511/can-i-use-visual-studio-2010s-c-compiler-with-visual-studio-2008s-c-runtim
http://tedwvc.wordpress.com/2010/11/07/how-to-get-visual-c-2010-mfc-applications-to-run-on-windows-2000/

Ну и еще:

To build your own copies of the C run-time library files
http://msdn.microsoft.com/en-us/library/k9a8ehy3%28VS.100%29.aspx




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 03 мая 2012 15:44
· Личное сообщение · #12



-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 03 мая 2012 18:12
· Личное сообщение · #13

KViNTO пишет:
У себя для программного определения версии exe-файла использовал GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue.

Сделал через VerQueryValue:
Code:
  1. FileVersionInfo:=TFileVersionInfo.Create(Self);
  2. FileVersionInfo.Filename:='C:\WINDOWS\explorer.exe';
  3. Edit1.Text:=FileVersionInfo.FileVersion;
  4. Edit2.Text:=FileVersionInfo.Comments;

Сам модуль FileVersionInfo в аттаче.
Нифига не работает,почему-то переменная buff всегда не определена

8b8d_03.05.2012_EXELAB.rU.tgz - FileVersionInfo.pas



Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 03 мая 2012 18:15
· Личное сообщение · #14

Иными словами условие if buffsize > 0 then Result := str всегда ЛОЖЬ. Result := 'ошибка буфера' вне зависимости какую информацию из файла извлекать,и какой файл



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 03 мая 2012 18:26
· Личное сообщение · #15

О продуктах MS VC++
Microsoft's Rich Signature (undocumented)
довольно интересно
http://www.ntcore.com/files/richsign.htm



Ранг: 17.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 мая 2012 20:16
· Личное сообщение · #16

Svinovod пишет:
Иными словами условие if buffsize > 0 then Result := str всегда ЛОЖЬ. Result := 'ошибка буфера' вне зависимости какую информацию из файла извлекать,и какой файл

Посмотрите хотя бы здесь http://delphiworld.narod.ru/base/get_file_version.html, эта функция прекрасно работает.



Ранг: 3.7 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 03 мая 2012 20:28
· Личное сообщение · #17

KViNTO я хочу эту реализовать http://www.delphimaster.ru/articles/versioninfo.html
Она более функциональная,только автор статьи не написал как его замечательный модуль правильно вызывать из основного Unit-а.Я всё сделал,только эта строчка не работает:
VerQueryValue(VIBuff,pchar('\StringFileInfo'+LanguageInfo+''+From), pointer(str), buffsize);
Тут первые 2 параметра входные (буфер + адрес извлечения данных) и 2 параметра выходные (str не знаю зачем нужен, buffsize размер буфера - он должен быть больше 0)
From это то что извлекается: CompanyName,FileVersion,ProductName и так далее




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 03 мая 2012 23:30
· Личное сообщение · #18

Ты про мсдн вообще слышал? http://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx Не в состоянии в документированную функцию 4 параметра передать?


 eXeL@B —› Программирование —› Как программно определить версию exe-файла и версию компилятора на Delphi или С++
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати