Работает в Win Xp но не работает Win 2000

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Работает в Win Xp но не работает Win 2000

Сообщение SLIM » 16.03.2011 (Ср) 22:06

Есть программа, писал с помощью VS 2010 на сях.
Так вот эта самая программа спокойно запускается в Win XP но не работает в Win 2000. Ладно бы ошибка была значимая, так пишет "Не является win32 приложением".
Не знаю на что думать - столкнулся впервые с таким. Подумал о совместимости версий. Может не совместимы какие-то функции. Но вроде ничего особого нет.
Так или иначе - должен был ругнуться по поводу какой-то библы или функции. Но он ругается на формат. Но формат PE вроде одинаковый для всех Win. Может SDK какую-нибудь поставить? Хочется также сохранить совместимость Win XP, Win 2000, Win Vista, Win 7.

Подскажите
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Работает в Win Xp но не работает Win 2000

Сообщение SLIM » 16.03.2011 (Ср) 22:39

Вроде нашел наконец
http://msdn.microsoft.com/ru-ru/library/6sehtctf.aspx
Пишите жизнь на чистовик.....переписать не удастся.....

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Работает в Win Xp но не работает Win 2000

Сообщение Admiralisimys » 16.03.2011 (Ср) 23:11

SLIM это не то.
Линковщик (link.exe), входящий в Visual С++ 2010, по умолчанию в PE Optional Header поле SubsystemVersion определяет как 5.1. Не факт что документированными возможностями это положение дел можно изменить.

Один из недокументированных путей, на примере прошлой версии - Targeting Windows 95 in Visual Studio 2008

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Работает в Win Xp но не работает Win 2000

Сообщение SLIM » 16.03.2011 (Ср) 23:54

Ужастно. Жутко не хотелось чтобы проблема была где-то в недрах PE
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работает в Win Xp но не работает Win 2000

Сообщение Хакер » 16.03.2011 (Ср) 23:58

Admiralisimys писал(а):Линковщик (link.exe), входящий в Visual С++ 2010, по умолчанию в PE Optional Header поле SubsystemVersion определяет как 5.1. Не факт что документированными возможностями это положение дел можно изменить.

Вот уж проблема: вызвать над выходным файлом утилиту editbin с ключём /subsystem и указать нужную версию.
Вот уж проблема: использовать любой другой линкер, например линкер из прыдыдущих версий или линкер от Юрия Харона.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Работает в Win Xp но не работает Win 2000

Сообщение SLIM » 17.03.2011 (Чт) 0:28

Хакер писал(а):Вот уж проблема: вызвать над выходным файлом утилиту editbin с ключём /subsystem и указать нужную версию.

Это не очень. Лучше было бы если компиляция сразу была нужная.
Хакер писал(а):Вот уж проблема: использовать любой другой линкер, например линкер из прыдыдущих версий или линкер от Юрия Харона.

А это можно попробовать, но будет ли он работать, вопрос конечно.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работает в Win Xp но не работает Win 2000

Сообщение Хакер » 17.03.2011 (Чт) 0:35

SLIM писал(а):Это не очень. Лучше было бы если компиляция сразу была нужная.

Компиляция — это последовательный вызов сначала CL.EXE для генерации кучи OBJ-файлов, затем один или более вызова LINK.EXE для генерации из этих OBJ-файлов EXE- или DLL-файлов. От того, что в цепочку вызовов CL и LINK будет вставлен вызов EDITBIN, компиляция не перестанет быть компиляцией.

SLIM писал(а):А это можно попробовать, но будет ли он работать, вопрос конечно.

Какие причины у него не работать? COFF-формат — он и в Африке COFF-формат.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Работает в Win Xp но не работает Win 2000

Сообщение SLIM » 17.03.2011 (Чт) 0:38

Ок, попробую.
Спасибо
Пишите жизнь на чистовик.....переписать не удастся.....

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Работает в Win Xp но не работает Win 2000

Сообщение Admiralisimys » 17.03.2011 (Чт) 21:08

Поля в PE Optional Header, с требуемой версией Виндовс идут парами, помимо MajorSubsystemVersion и MinorSubsystemVersion, которые можно исправить упомянутой editbin /SUBSYSTEM:WINDOWS,5.0, останутся ещё поля MajorSysVersion и MinorSysVersion сходной функциональности.
Не в курсе С++ нововведений в 2010й версии студии, но могу предположить что не всё что соберёт cl из Visual C++ 2010 адекватно сможет закомпоновать link от одной из предыдущих версий. По мне так уж лучше изначально собирать проект в 2008 (или 2005й) если нужна бинарная поддержка Win2000.
А вот линкер от Юрия Харона похоже (не проверял) единственный из предложенных вариантов решения.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работает в Win Xp но не работает Win 2000

Сообщение Хакер » 17.03.2011 (Чт) 21:25

Admiralisimys писал(а): останутся ещё поля MajorSysVersion и MinorSysVersion сходной функциональности.

Пишется утилитка (свой editbin) из десятка строк, которая меняет значения этих полей.
Код: Выделить всё
    LOADED_IMAGE img;
    MapAndLoad(..., ..., &img, ..., FALSE);
    img.FileHeader.OptionalHeader.MajorOperatingSystemVersion = xx;
    img.FileHeader.OptionalHeader.MinorOperatingSystemVersion = yy;
    UnMapAndLoad(&img);
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList