Что-то я решил молодость вспомнить. Перед тем, как меня понесло в сторону Perl, юниксов и всякой функциональщины, я долгое время игрался с сями, ассемблером и WinAPI. Сейчас все это начинает потихоньку забываться, а жаль, потому что, как мы уже выясняли, знать всякие низкоуровневые вещи полезно.
Предвижу возмущение некоторых читателей сего блога, дескать, что за дела, я не хочу читать про WinAPI, я хочу ФП и юниксы! Если вы оказались одним из них, пожалуйста, пройдите по приведенной выше ссылке и внимательно ознакомьтесь с тамошней заметкой, она вам все объяснит. Хорошая новость для новичков — при помощи серии постов о WinAPI, которую я планирую написать, вы можете начать изучение программирования практически с нуля. Впрочем, прочитать сначала книжку Кернигана и Ритчи, а также иметь представление о том, как язык Си хранит в памяти целые числа и строки, не повредит.
Для написания кода я буду использовать Windows XP, запущенный под Ubuntu Linux в VirtualBox, и среду разработки Visual Studio 2005. Если вы тоже не сидите под Windows, советую выбрать такую же конфигурацию, поскольку более поздние версии Visual Studio и Windows требуют крайне много ресурсов. Обязательно установите гостевые дополнения, это позволит использовать в Windows такое же разрешение экрана, что и в хост-системе.
Современные приложения на Windows XP-как это работает?
Если даже WinXP для вас тяжеловата, подойдут Windows 2000 и Visual C++ 6.0. Несмотря на то, что я буду использовать не самые свежие Windows и Visual Studio, по идее все должно прекрасно работать и в более поздних их версиях. Кроме того, не должно составить большого труда воспроизвести мои действия в каком-нибудь wxDev-C++ или даже Borland Delphi. Писать будем на Си, возможно, лишь изредка прибегая к некоторым фишкам C++.
Дополнение: Надо отдать должно Microsoft, самые актуальные на середину 2017-го года Windows 10 и Visual Studio Community довольно шустро работают в условиях ограниченных ресурсов под VirtualBox. Более того, Visual Studio Community доступна для скачивания совершенно бесплатно.
Установить Visual Studio несложно. Будем считать, что с этим вы справились. Давайте создадим новый проект. Запустите Visual Studio и выберите в меню File → New → Project. В появившимся диалоге выберите Visual C++ → Win32 → Win32 Project.
В поле Name введите какое-нибудь название проекта, например, First. Жмите OK, Next, Finish. В результате будет создан каркас проекта. Обратите внимание на выпадающий список с конфигурациями проекта по центру экрана. Выберите в нем конфигурацию Release:
Для компиляции программы нажмите F7. Для ее запуска нажмите Ctr+F5. Если вы используете VirtualBox, обратите внимание, что правая клавиша Ctr используется в хоткеях, управляющих виртуальной машиной. Например, сочетание Ctr+F служит для переключения между оконным и полноэкранным режимами. Поэтому, если вы решили использовать VirtualBox, используйте в хоткеях Visual Studio клавишу Ctr, находящуюся слева.
Если теперь перейти в каталог с проектом и найти собранную программу (она находится в подкаталоге с именем release), можно обнаружить, что ее размер составляет 64 Кб. По нынешним меркам это не так уж много, но все-таки что-то многовато для программы, всего лишь рисующей окошко с менюшкой. Мы же собираемся писать на Си и WinAPI, а одним из преимуществ этого подхода является возможность писать очень компактные программки.
Давайте разберемся, как это делается:
- Закройте текущий проект: File → Close Solution;
- Создайте новый проект с именем Project, в визарде поставьте галочку Additional Options → Empty Project;
- Выберите конфигурацию Release;
- Создайте новый файл исходного кода, сказав Project → Add New Item… → Visual C++ → Code → C++ File (.cpp), с именем Main;
- Откройте свойства проекта: Project → Project Properies…;
- Отключите проверку безопасности буфера: C/C++ → Code Generation → Buffer Security Check → No;
- Сообщите, что мы пишем код на Си: С/C++ → Advanced → Compile As → Compile As C Code;
- Игнорируем библиотеки по умолчанию: Linker → Input → Ignore All Default Libraries → Yes;
- В качестве точки входа указываем процедуру main: Linker → Advanced → Entry Point → main;
- Отключаем отладочную информацию: Linker → Debugger → Generate Debug Info → No;
- Отключаем генерацию манифеста: Liner → Manifest File → Generate Manifest → No;
- Жмем Apply, затем OK;
Теперь, если вы напишите в Main.cpp код:
… и скомпилируете его, то получите абсолютно ничего не делающий исполняемый файл Project.exe, размером ровно 1 Кб. Программа получилась такой маленькой, потому что мы выкинули из нее систему времени исполнения языка C++, а также отладочную информацию и прочий «мусор». Фактически, это минимальный размер исполняемого файла в Windows, поскольку он должен содержать некоторую служебную информацию (DOS-заглушку, PE-заголовок, таблицу секций) и иметь некоторое выравнивание. Можно ужать его еще чуть-чуть, но этим мы рискуем сломать совместимость с некоторыми версиями Windows.
Чтобы при создании каждого нового проекта не повторять описанные выше шаги, закройте проект и сохраните его в архиве с названием типа project_template.zip. Теперь попробуем на основе этого проекта создать программу, которая что-то делает. Разархивируйте проект, переименуйте его каталог из Project в MsgBox, откройте проект в Visual Studio. Введите следующий код:
void main ( ) {
MessageBox ( 0 , L «Hello!» , L «MsgBox» , 0 ) ;
ExitProcess ( 0 ) ;
}
Заметьте, что VisualStudio может дополнять имена процедур, если при их вводе нажать Ctr+пробел. Для сохранения кода используйте сочетание Ctr+S. При вводе аргументов процедур отображается подсказка.
Если теперь вы запустите программу, то увидите примерно следующее:
Размер exe-шника при этом составил 2 Кб. Можно уменьшить его до 1 Кб, добавив в самом начале кода строку:
#pragma comment(linker, «/MERGE:.rdata=.text»)
Этим мы говорим компилятору объединить несколько секций исполняемого файла в одну. Но мне кажется, что это уже перебор, файл и так получился крохотный. Есть и другие приемы, но нам вполне хватит описанных выше.
Приведенный выше код довольно прост. Заголовочный файл windows.h содержит объявление процедур, структур и констант, необходимых для работы с WinAPI. Процедура ExitProcess завершает текущий процесс с кодом возврата, переданным в качестве аргумента. Процедура MessageBox отображает окно с сообщением. Первый и последний ее аргументы сейчас не важны.
Второй по счету аргумент представляет собой строку с сообщением, а третий — заголовок окна.
Префикс L перед открывающей кавычкой означает, что строка хранится в unicode. В действительности, есть две версии процедуры MessageBox — MessageBoxA, работающая с ascii-строками, и MessageBoxW, работающая со строками в unicode. Аналогичная ситуация характерна и для большинства других процедур WinAPI.
По умолчанию в свойствах проекта сказано использовать unicode-версии процедур, поэтому во время сборки проекта компилятор подменяет вызов MessageBox на MessageBoxW. На низком уровне ascii-процедуры представляют собой всего лишь обертки над unicode-версиями (для преобразования строк из unicode в ascii и обратно в Windows используются процедуры MultiByteToWideChar и WideCharToMultiByte). Работая с процедурами, имена которых заканчиваются на «W», мы получаем более быстрые программы.
В заключение хочется отметить, что приведенный код успешно компилируется MinGW и запускается под Wine:
$ i586-mingw32msvc-gcc -s -DUNICODE msgbox.c -o msgbox.exe
$ wine msgbox.exe
Правда, в результате получается exe-шник, содержащий «мусор», избавление от которого выходит за рамки этого поста.
Собственно, это все, о чем я хотел сегодня рассказать. В качестве домашнего задания можете почитать документацию к MessageBox на MSDN. Попробуйте отобразить окна с различными иконками и кнопками, а также по коду возврата определить, какая из кнопок была нажата.
Как всегда, буду рад ответить на ваши вопросы. И заодно скажите, насколько вообще все это вам интересно?
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.
Источник: eax.me
Разработка приложений для Windows XP в Visual Studio 2017 + Windows 10?
Есть потребность в том, чтобы моя программа имела полноценную поддержку Windows XP. Как реализовать эту поддержку в Visual Studio 2017, которая установлена в среде Windows 10?
Отслеживать
20.1k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
задан 23 сен 2018 в 15:53
Super_Puper_User Super_Puper_User
293 3 3 серебряных знака 21 21 бронзовый знак
windows xp мертв
23 сен 2018 в 15:58
23 сен 2018 в 15:59
На каком языке пишете? C#, C++?
23 сен 2018 в 16:29
C++.
С C# всё проще, просто скачай Framework
25 сен 2018 в 22:08
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- Установите набор инструментов для построения под WinXP.
Запустите инсталлятор Visual Studio (через пункт «Изменить» в «Программах и компонентах»), на странице «Компоненты» установите галку Windows XP support for C++, нажмите «Установить».
- Измените свойства проекта
На вкладке «Общие» в поле «Набор инструментов платформы» («Platform toolset») выберите Visual Studio 2017 — Windows XP (v141_xp)
- Не используйте API, которые отсутствуют в Windows XP (например, DWM API, Multimedia Device API, Speech Recognition API, IMAPI, Network List Manager и др.)
Отслеживать
ответ дан 26 сен 2018 в 11:22
MSDN.WhiteKnight MSDN.WhiteKnight
20.1k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
- c++
- visual-studio
- windows-xp
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник: ru.stackoverflow.com
Запуск (сборка) приложения Qt для Windows XP
Иногда может случиться такая ситуация, что необходимо скомпилировать и в будущем запустить ваше приложение, разработанное в среде Qt Creator в устаревшей Windows XP. Разберём в этой статье, как это сделать.
И вот, ваши дела шли чудесно, но в один день вам захотелось/понадобилось запустить ваше приложение в Windows XP. «Элементарно» — подумали вы, но тут не так всё просто. Перейдя на официальную вики Qt , в статью по поддержке платформ (https://wiki.qt.io/PlatformSupport), можно увидеть, что в таблице официальная поддержка Win Xp есть в версия Qt с 5.0 по 5.6.
Поэтому самым простым и действенным способом будем скачивание Qt, например, версии 5.5.1 (qt-opensource-windows-x86-mingw492-5.5.1.exe) с репозитория https://download.qt.io/archive/qt/5.5/5.5.1/ и установка на свой ПК (если у вас стоит более новая версия).
Будем использовать такую связку: Qt+MinGW 4.9.2 32 bit, что и укажем во время установки Qt.
После установки, запустим Qt и откроем проект и на экране появится следующий предупреждающий диалог (необходимо нажать кнопку «ок»):
Далее необходимо выбрать компилятор и нажать кнопку «Настроить проект». Если вдруг у вас после установки определился не тот компилятор, отладчик или комплект, то вы можете воспользоваться методикой из статьи http://2compa.ru//qt-creator/kak-ustanovit-mingw-7-3-0-32bit-dlja-qt-creator-5-12-0/ , где я рассказывал, как вручную настроить MinGW 7.3, но по такой же методике, вы сможете в параметрах сборки и запуска, настроить свой комплект Qt.
Добавим в файл .pro следующую строку:
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
Попробуем скомпилировать проект. В моём случае проект небольшой (2500 строк) и он удачно скомпилировался. Бинго! Программа запущена. В вашем случае компилятор может выдавать ошибки (из-за разности версий и меняющегося Qt-функционала), которые придётся исправлять.
Для этого, пользуйтесь гуглом.
Небольшая оговорка: Qt 5.5.1 у меня почему-то не запустился на Win XP, но запустился на Win 7, а затем после того как я собрал все необходимые .dll, программа запустилась и на Win XP (с пакетом обновления 3).
Как собрать .dll в одном месте для программы, написанной в Qt, чтобы запустить на Win XP?
1 Вариант. Windeployqt
Для того, чтобы собрать все файлы .dll в одном месте, которые необходимы для запуска вашей программы, лучше всего воспользоваться инструментом windeployqt, находящемуся по пути
Диск:Путь установки QtВерсия Qtmingw***_**bin.
Чтобы это сделать откройте два окна проводника, в одном папку релиза вашего проекта, в котором оставьте просто .exe файл. А во втором окне путь с инструментом, указанным выше.
И перетащите файл с названием вашего проекта на файл windeployqt.exe. Далее пойдёт процесс копирования необходимых файлов в папку с исполняемым файлом.
Конечно, у этого инструмента есть недостаток. Недостаток заключается в том, что он копирует не все необходимые .dll и с высокой долей вероятности ваша программа при запуске может выдать системную ошибку, вроде такой:
Для исправления такой ошибки, нужно скопировать файл libgcc_s_dw2-1.dll в каталог с программой (этот файл находится по пути инструмента windeployqt). Соответственно, эту процедуру нужно сделать для всех ошибок такого рода. После этого, программа должна успешно запуститься по нажатию на исполняемый файл.
2 Вариант. LibraryCollector (раньше назывался DLLCollector)
Скачиваем DLLCollector или LibraryCollector (по моим ощущениям более старый DLLCollector работает стабильнее). Скачать LibraryCollector вы можете по следующей ссылке с киберфорума. А устаревшую DllCollector можете скачать по прямой ссылке с моего блога.
Запускаем утилиту (обязательно от имени администратора) и указываем пути:
name – путь к исполняемому файлу.
bin – путь к папке bin в папке mingw***_** по пути с Qt Creator.
plugins – путь к папке plugins в папке mingw***_** по пути с Qt Creator.
to – путь к папке, в которую будут копироваться dll и исполняемый файл.
Нажимаем кнопку «Run», ваша программа должна запуститься. Далее закройте программу и нажмите кнопку «Update». Далее вам необходимо выполнять действия в программе, чтобы утилита определила все файлы, необходимые для работы вашей программы, которые отобразятся в списке:
Закройте программу и нажмите кнопку «Copy». Все необходимые для работы .dll скопируются в папку с вашим исполняемым файлом. Поздравляю!
Небольшие ХАКИ для запуска приложения в WIN XP. Исправление ошибки « Не является приложением Win32».
Если вы используете Qt вместе с Visual Studio (а не компилятором MinGW) и пытаетесь развернуть свое приложение на компьютере под управлением Windows XP или Windows Server 2003, скорее всего, вы видите эту ошибку.
Эта ошибка не возникнет для Qt с Visual Studio 2010, но появляется при использовании Visual Studio 2012, 2013 или Visual Studio 2015.
Самый простой способ это исправить – добавить одну дополнительную строку в файл .pro вашего проекта. Второй способ – выполнить бинарное исправление файла .exe вашего приложения.
Небольшое примечание: Эта же ошибка («…не является приложением Win32») возникает при попытке запустить 64-разрядное приложение в 32-разрядной системе Windows XP или Windows 2003, поэтому убедитесь, что ваше приложение действительно 32-разрядное. Один из способов проверки разрядности: запустите приложение в Windows 7 или 10, запустите диспетчер задач, на вкладке процесса проверьте, что имя вашего приложения имеет суффикс «*32».
Для первого способа достаточно открыть .pro файл вашего проекта и добавить туда следующую строку:
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
Примечание: если вы компилируете 64-битный файл .exe (и, таким образом, нацелены на 64-битную Windows XP), вместо этого вам следует установить для QMAKE_LFLAGS_WINDOWS значение /SUBSYSTEM:WINDOWS,5.02.
Второй способ – более экзотический, для этого воспользуемся редактором двоичных / шестнадцатеричных файлов. Откройте файл .exe вашего приложения, перейдите почти к началу файла и отыщите шестнадцатеричную последовательность 06 00 00 00 00 00 00 00 (повторяется один раз). Эта строчка находится по адресу 0000130, но может находиться между 0000120 и 0000150. Замените её на 05 00 01 00 00 00 00 00.
Примечание: если это 64-битный файл .exe, вместо этого вы должны изменить строку на 05 00 02 00 00 00 00 00.
Сохраните exe файл и он должен запуститься. Специально для вас записал видео, как запустить exe вне QT:
Источник: 2compa.ru