Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
zombivadim
8 / 8 / 1
Регистрация: 03.04.2016
Сообщений: 198
#1

Определить версию компилятора, на котором собиралась программа - C++ WinAPI

02.01.2017, 19:00. Просмотров 396. Ответов 11
Метки нет (Все метки)

Подскажите, попалась одна интересная программка, которая определяет версии компиляторов, почти любого файла, как она это делает? Может есть в WINAPI специальные функции для работы с подобной информацией? И как вообще информация о компиляторе хранится в файле?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2017, 19:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить версию компилятора, на котором собиралась программа (C++ WinAPI):

Ошибка компилятора fatal error C1091: ограничение компилятора: длина строки превышает 65535 байт - Visual C++
Компилируя программу вот такой командой: cl /O2 /Oi /GL /EHsc /MD /Gy main.cpp И компилятор выдает вот такую ошибку: ...

Как в примере кода сделать так, чтобы страничка при изменении масштаба собиралась в середину? - HTML, CSS
Здравствуйте, решил попрактиковаться в стилях и вроде как сделал страничку, но не так, как хотелось. Как в примере кода сделать так, чтобы...

определить версию... - Delphi
Доброго времени суток!!! возник вопрос, как можно проверить версию .dll файла? потому что программа подвязана к определённой версии...

SFML: Как сделать чтобы каждая буква отдельно выходила из разной точки и собиралась в одно слово? - SFML
скажите пожалуйста можно ли сделать так чтоб каждая буква отдельно выходила из разной точки и собиралась в одно слово??? желательно с...

Программа перестает работать правильно, если более одного раза используются директивы компилятора {$I-+} - Pascal
Первый пост на форуме) Начал на досуге изучать паскаль. Пытаюсь написать простенькую программку, которая складывала бы два числа. Решил...

Определить версию opengl - OpenGL
Нужен код на opengl es 2, а в сети полно кода для первой версии как можно быстро определять версию opengl по коду? черная метка что...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
02.01.2017, 20:08 #2
Это она думает, что определяет :-)

В большинстве случаев, относительно уверенно можно назвать только диапазон версий (например, MSVC 6.0 - 9.0) + гадание по версии линкера (которая может и не совпадать с реальной версией компилятора или быть переписана пакером / протектором).
0
zombivadim
8 / 8 / 1
Регистрация: 03.04.2016
Сообщений: 198
02.01.2017, 21:11  [ТС] #3
gazlan, Вы добавили больше вопросов, чем ответов.
Цитата Сообщение от zombivadim Посмотреть сообщение
как она это делает? Может есть в WINAPI специальные функции для работы с подобной информацией? И как вообще информация о компиляторе хранится в файле?
0
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
02.01.2017, 22:16 #4
Цитата Сообщение от zombivadim Посмотреть сообщение
Может есть в WINAPI специальные функции для работы с подобной информацией?
Нет.

И как вообще информация о компиляторе хранится в файле?
Обычно, не хранится - за ненадобностью. Но некоторые компиляторы (GCC, FreePascal etc) оставляют метки версий в виде строковых констант. Другие (Borland CPP, PowerBasic etc) имеют характерный стаб на точке входа (EP), иногда версию можно уточнить по вызовам характерных функций, не существовавших в ранних версиях итп.

С другой стороны, многие специфические компиляторы (например, e-books, инсталляторы итп) добавляют к контенту собственные, легко определяемые сигнатуры. Delphi хранит информацию о типе лицензии (Personal / Professional / Enterprise).
0
zombivadim
8 / 8 / 1
Регистрация: 03.04.2016
Сообщений: 198
03.01.2017, 00:54  [ТС] #5
gazlan,
Цитата Сообщение от zombivadim Посмотреть сообщение
как она это делает?
Ваши соображения?
Например мой файл определяет Компилятор: Microsoft Visual C++ 8.x (2005)
0
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
03.01.2017, 10:08 #6
Цитата Сообщение от zombivadim Посмотреть сообщение
Ваши соображения?
Ждете диагноз по фотографии?

Таких программ несколько, по крайней мере одна из них - DiE должна быть с открытым кодом - качайте и разбирайтесь.
1
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
03.01.2017, 10:29 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вообще то в дополнительном заголовке PE-файлов IMAGE_OPTIONAL_HEADER есть специальные поля:
C++
1
2
BYTE                 MajorLinkerVersion;
BYTE                 MinorLinkerVersion;
, но как верно заметил gazlan, то что в них записано может совсем не соответствовать действительности.
1
zombivadim
8 / 8 / 1
Регистрация: 03.04.2016
Сообщений: 198
05.01.2017, 22:50  [ТС] #8
rao, Покопался в файловых структурах, вы правы. Остается вопрос как использовать значения получаемые в
Цитата Сообщение от rao Посмотреть сообщение
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
Как узнать какое значение используется именно для нужного компилятора?
0
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
06.01.2017, 11:07 #9
Готового списка найти не смог. Остается только "методом тыка": брать компилятор, собирать .EXE и смотреть какие значения будут туда записаны. Но особо полагаться на эти цифры не стоит, потому что единой системы нет и разные компиляторы ведут себя как им заблагорассудится. Вот пара примеров из исходников DiE (которую давал gazlan):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function getVCVersionFromLinkerVersion()
{
    var sResult="";
    switch(PE.getMajorLinkerVersion())
    {
    case 3:  sResult=PE.getCompilerVersion();   break; // MS C++
    case 4:  sResult="4.0";  break;
    case 5:  sResult="5.0";  break;
    case 6:  sResult="6.0";  break;
    case 7:
        if(PE.getMinorLinkerVersion()<10)
        {
            sResult="2002";
        }
        else
        {
            sResult="2003";
        }
        break;
    case 8:  sResult="2005"; break;
    case 9:  sResult="2008"; break;
    case 10: sResult="2010"; break;
    case 11: sResult="2012"; break;
    case 12: sResult="2013"; break;
    case 13: sResult="2015"; break;
    }
 
    return sResult;
}
А так определяется для MinGW:
C++
1
2
3
4
5
6
    if(PE.getMajorLinkerVersion()==2)
    {
        if(PE.getMinorLinkerVersion()<=30||PE.getMinorLinkerVersion()==56)
        {
            if(PE.compare("'MZ'9000030000
...
В общем всё очень по-разному.
0
zombivadim
8 / 8 / 1
Регистрация: 03.04.2016
Сообщений: 198
06.01.2017, 22:50  [ТС] #10
rao, Не все так радужно. Я уже не стал работать в своей программе, а выбрал PETools, обнуляем значения MajorLinkerVersio и MinorLinkerVersion; Однако DiE и все остальные программы, продолжают правильно определять компилятор. Почему ????
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
07.01.2017, 09:26 #11
zombivadim, я подозреваю, что эти программы могут использовать
что-то вроде сигнатурного поиска. Например, компилятор MS C/C++ вставляет
свой специфический код в точку входа exe/dll (называется __mainCRTStartup),
он в большинстве версий меняется незначительно и по нему можно делать детект.
Еще к названиям и размещению секций в PE-заголовке, наверное, можно привязаться.
И т.д.
1
jupman
209 / 112 / 16
Регистрация: 10.11.2015
Сообщений: 278
07.01.2017, 12:02 #12
Цитата Сообщение от zombivadim Посмотреть сообщение
Однако DiE и все остальные программы, продолжают правильно определять компилятор. Почему ????
Исходники DiE то поизучайте, на которые rao ссылку дал. Вот, например, сигнатуры для Visual Studio. Кстати, DiE позволяет сигнатуры через свой интерфейс просматривать (кнопка "Signatures"). У вас видимо старая версия, раз нет данной кнопки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 12:02
Привет! Вот еще темы с ответами:

Как определить версию ОС? - Visual Basic
Необходимо выяснить какая ось - 98,95 или 2000

Необходимо определить версию IE - PowerShell
Добрый День! Необходимо получить версию IE При выполнении скрипта, версия определяется только у ОС Windows 7 и моложе, но не извлекает...

определить версию windows - C++
гомпода програмисты возможно как то програмно определить версию windows,что бы потом это использовать т.е. стоит ХР выводим на экран привет...

Определить версию BASIC - Basic
Не знаю как бы правильно сказать. Попросили найти Basic старый( примерно 20 летней давности) Мой преподаватель математики, говорил что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.01.2017, 12:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru