Как установить winapi visual studio
КАК подготовить и запустить проект Win API?
Итак, маленькая предыстория. Когда мы работали в Borland C++ 3.1 достаточно было создать новый файл, настучать в него текст программы и запустить. Компилятор принимал имя файла и создавал выполнимый EXE-файл. С тех пор концепция программирования несколько изменилась. Программисты для Windows обычно работают с очень большим количеством файлов, которые объединены в проект. Проект включает в себя не только исходные тексты, но и библиотеки и внешние текстовые файлы, используемые для записи промежуточных и конечных результатов, файлы типа Excell, базы данных XML, иконки, курсоры, картинки, аудиои видеофайлы и многое другое. Поэтому ошибкой было бы писать текст в редакторе типа "Блокнот", а потом пытаться открыть его с помощью VC++ да ещё и скомпиллировать. Visual С изначально понимает только проекты, причём созданные в нём самом.
Подчиняясь суровой необходимости, открываем Visual C++. На экране то, что обычно. Ничего. В лучших традициях Microsoft - никакого намёка на то, что делать дальше.
Сейчас вам предстоит определиться с тем, какая версия Visual Studio стоит на вашем компьютере. Если их несколько, имеет смыл использовать самую новую. Программисты - это люди завтрашнего дня.
Итак, если у вас стоит Visual Studio, то вам сюда. Сейчас я научу вас создавать программы на API. Эти рекомендации пригодятся вам в дальнейшем, когда вы будете создавать проекты для последующих, более сложных примеров.
Запустите программу Visual C++ через меню пуск. На экране появится пустое окно программы, впрочем, готовое к сотрудничеству. Беглый осмотр говорит нам о том, что в программе есть свойственная всем продуктам Microsoft панель управления для удобного редактирования текстов, а также меню. Назначение многих элементов меню и кнопок из панели управления мы будем разбирать по ходу пьессы.
В Visual Studio можно создавать удивительно много полезных штук. Создание Win API - программ - не единственное, что в ней можно делать. Чаще всего она используется для создания программ на основе библиотеки классов MFC. Но и это не обязательно. Поэтому, при создании нового проекта, надо его как следует настроить.
Выберите пункты меню File->New->Project. У вас появятся аналогичные окна New или New Project. Для версий 6.0 и 7.0 соответственно.
| |
В списке перечислены основные типы проектов, которые можно создавать в Visual C++. Освоим пока только один из них.
В окне New (New Project) выберите тип "Win 32 Application" ("Win32 Project"). Win 32 Application - это и есть программа на API. Сейчас от нас требуется дать имя нашему проекту - заметьте, не файлу, не будущей программе, а проекту. В большинстве случаев это имя может быть любым, но мой вам совет - давайте говорящие имена, чтобы потом не гадать, чем Project4 отличается от Project111. Пусть имя первого проекта будет First. В поле Location будет указан путь, по которому будет создана одноимённая папка для проекта First, в которой будет размещён весь наш проект. Нажмите Ok.
| |
Это ещё не всё. Появится следующее окно, которое будет просить определить содержание проекта. В Visual C++ есть некоторые шаблоны, которые позволяют избавить разработчика от многих рутинных операций - они сами создают исходные файлы и даже прописывают в них какой-то минимальный код. Так, например, чтобы не перетруждаться, мы можем создать готовое окно с меню и строкой состояния. К шаблонам мы ещё вернёмся, а пока изучим всё с азов. В Visual C++ 6.0 надо поставить галочку на An Empty Project ("Пустой проект"), так как мы будем создавать всё вручную, и нажать кнопку Finish. В 7-й версии надо перейти на закладку Application Settings ("Настройки приложения") и поставить галочку Application Type - Windows Application, Application options: Empty рroject. И тоже нажать Finish ("Завершить") .
У вас появился готовый проект, правда в нём пока ещё нет ровным счётом ничего. У нас есть проект, но пока нет программы. Остаётся набрать исходный текст и добавить его в проект. Вообще особенность пустых проектов - то, что надо добавлять в него все файлы вручную, несмотря на то, исходники это, библиотеки или ресурсы.
Вот такой вид будут иметь пустые проекты:
| |
Теперь познакомимся поближе с редактором. Как и в любой программе Windows, в верхней части окна расположены меню и панель инструментов. Она стандартная для всех приложений Microsoft, и я думаю, со многими кнопками (такими, как Сохранить, Копировать, Вырезать, Вставить) вы уже знакомы.
В нижней части программы, как и в Borland C++ окно комментариев компилятора. В нём будет вестись журнал компиляции, компоновки и построения, отображаться статус проекта, выдаваться предупреждения (warnings), ошибки (errors) и комменатрии. Чтобы оно не мешало, его можно закрывать, когда вы работаете с кодом.
В левой части окно навигатора, в котором есть три вкладки: Files (Файлы), ClassView (Вид классов) и Resource (Ресурсы).
Вкладка FileView - файлы, которые входят в проект. Они условно разделены на три папочки: Source (исходники), Headers (Библиотеки, заголовочные файлы), Resources (ресурсы - картинки, иконки, курсоры). В больших проектах количество файлов и папок может доходить до тысячи, поэтому очень удобно иметь весь список файлов перед собой, чтобы быстро получить доступ к нужному.
ClassView - диаграмма классов, используемых в программе. Поскольку язык API процедурный, нам она пока не понадобится.
ResourceView - содержит наши ресурсы. Они описаны в файле ресурсов. Этот файл носит вспомогательный характер, но он очень важен. В нём описаны все ресурсы приложения - диалоговые окна, панели инстрментов, меню, картинки, иконки, курсоры и многое другое. В MFC этот файл генерируется автоматически, нам придётся создавать его вручную. Для этого придётся овладеть нехитрым языком описания ресурсов. Обычно файл ресурсов имеет расширение: *.RC
Пока что проект пуст и не содержит никаких файлов. Чтобы вы могли набирать исходные тексты из моей книги и других книг, вы должны освоить процедуру создания пустого проекта и включения в него файлов, описанные в этой главе. Рассмотрим методику включения файла исходника для обоих версий.
Вот теперь всё готово для ввода программы. Если вы выберите в навигаторе вкладку Files и раскроете папочку Source, то увидите, что в ней появился наш первый исходный файл First.cpp!
Примечание. Следите, чтобы все исходные файлы хранились в папке проекта. При большом количестве файлов удобно сортировать их по каталогам. Но всё равно, все каталоги должны храниться в одной общей папке - папке проекта.
Вот теперь в файл можно ввести какой-то текст. Итак, первая программа!
Самая первая программка будет такой:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
MessageBox(0, "Привет, Win32 API", "Первое окно. ", MB_ICONINFORMATION|MB_OK);
Не бойтесь, если вы ещё не знаете языка API. мы здесь и собрались для его изучения. Пока мы просто учимся работать с компилятором. Введите этот текст в файл First.cpp и сохранить его. Запустить программу на выполнение можно кнопкой F5. Компилятор переидёт в режим отладки нашего проекта. Вас спросят, хотите ли вы построить выполнимый файл. Вы ответите Yes, и через какое-то время, если всё правильно набрали, увидите свою программу. Так будут запускаться на исполнение все наши программы. После запуска build в папке проекта появится вложенная папка Debug, в которую будет помещён созданный нами файл First.exe.
Эта программка не содержит главного окна, которое в большинстве своём считается обязательным элементов для всех Windows-программ, если конечно они не консольные, однако это уже полноценная программа для Windows, о чём мы заявили, когда включили библиотеку windows.h. Далее идёт тело функции WinMain().
WinMain() - главная функция любой API программы - точка входа в неё. Нечто подобное представляла собой и функция main(), когда мы работали в DOS.
Как вы уже поняли, программа выводит на экран информационное окно, с которым вы конечно уже нераз сталкивались, когда работали в Windows в качестве пользователя.
Число кнопок также может варьироваться:
- только кнопка "ОК" (MB_OK)
- "Отмена" (MB_CANCEL)
- "Пропустить" (MB_IGNORE)
- "ОК и Отмена" (MB_OKCANCEL)
Окно, создаваемое MessageBox - стандартное окно Windows. Также к стандартным окнам относятся такие известные вам диалоги, как: окно выбора папки, окно открытия и сохранения файлов, окно выбора цвета, шрифта и окно настройки принтера. Они нам очень помогают, но к сожалению никогда не заменят главного окна программы, которое мы будем создавать сами.
Это была разминка с целью научить вас создавать проекты для Win32 API. С каждой новой главой, мы будем исследовать всё более сложные и всё более интересные вещи.
Задание:
Измените информационную иконку на вопросительную и придумайте вопрос, который задаёт программа (например "Вы действительно хотите удалить файл?"). В строке заголовка окна введите имя программы (в данном случае "First"). Пусть в новом окне теперь будут две кнопки: "ОК и Отмена". Запустите программу на выполнение.
Что будет дальше?
Вы наверное уже достаточно хорошо освоили работу с функцией MesaageBox и хотите двигаться дальше. Спешу вас обрадовать, что в следующей главе вы уже создадим своё первое окно!
Вы можете использовать интерфейсы API Composition среды выполнения Windows (также называемые визуальным уровнем) в приложениях Win32, чтобы создавать современные интерфейсы для пользователей Windows 10.
Полный код для этого руководства доступен на сайте GitHub: Пример приложения Win32 HelloComposition.
Предварительные условия
Для использования API размещения для UWP накладываются приведенные ниже предварительные требования.
-
Предполагается, что у вас есть опыт разработки приложений с помощью Win32 и UWP. См. также:
- Для параметра Конфигурации выберите Все конфигурации. Для параметра Платформа выберите Все платформы.
- Свойства конфигурации > Общие > Версия Windows SDK = 10.0.17763.0 или более поздняя версия.
- Компоновщик > Ввод > Дополнительные зависимости — этот раздел должен содержать windowsapp.lib. Если эта зависимость отсутствует в списке, добавьте ее.
- В обозревателе решений щелкните проект HelloComposition правой кнопкой мыши.
- В контекстном меню выберите Добавить > Класс.
- В диалоговом окне Добавление класса укажите имя класса, CompositionHost.cs, а затем щелкните Добавить.
- В CompositionHost.h сделайте конструктор частным.
- Объявите общедоступный статический метод GetInstance.
- В CompositionHost.cpp добавьте определение метода GetInstance.
- В CompositionHost.h объявите общедоступный метод Initialize, который принимает HWND в качестве аргумента.
- В CompositionHost.cpp добавьте определение метода Initialize.
- В CompositionHost.h объявите частный метод EnsureDispatcherQueue.
- В CompositionHost.cpp добавьте определение метода EnsureDispatcherQueue.
- В CompositionHost.h объявите частный метод CreateDesktopWindowTarget, который принимает HWND в качестве аргумента.
- В CompositionHost.cpp добавьте определение метода CreateDesktopWindowTarget.
- В CompositionHost.h объявите частный метод CreateCompositionRoot.
- В CompositionHost.cpp добавьте определение метода CreateCompositionRoot.
- В CompositionHost.h объявите общедоступный метод AddElement, который принимает 3 значения с плавающей запятой в качестве аргументов.
- В CompositionHost.cpp добавьте определение метода AddElement.
-
(Приступая к работе с Win32 и C++)
Как использовать интерфейсы API Composition из классического приложения Win32
При работе с этим руководством вы создадите простое приложение Win32 на C++ и добавите в него элементы композиции UWP. Основное внимание уделяется правильной настройке проекта, созданию кода взаимодействия и отрисовке простых элементов с помощью интерфейсов API Windows Composition. Завершенное приложение выглядит следующим образом.
Создание проекта C++ для Win32 в Visual Studio
Первым шагом является создание проекта приложения Win32 в Visual Studio.
Чтобы создать проект приложения Win32 на C++ с именем HelloComposition, сделайте следующее.
Откройте Visual Studio и выберите Файл > Создать > Проект.
Появится диалоговое окно Создать проект.
В категории Установлены разверните узел Visual C++ , а затем выберите Windows Desktop.
Выберите шаблон Классическое приложение Windows.
Введите имя HelloComposition, а затем нажмите кнопку ОК.
Visual Studio создаст проект и откроет редактор для основного файла приложения.
Настройка проекта для использования интерфейсов API среды выполнения Windows
Чтобы применить интерфейсы API среды выполнения Windows (WinRT) в приложении Win32, мы используем C++/WinRT. Чтобы добавить поддержку C++/WinRT, необходимо настроить проект Visual Studio.
В меню Проект откройте свойства проекта (Свойства HelloComposition) и убедитесь, что для следующих параметров заданы указанные значения.
Изменение предварительно скомпилированного заголовка
Переименуйте stdafx.h и stdafx.cpp в pch.h и pch.cpp соответственно.
Установите для свойства проекта C/C++ > Предварительно скомпилированные заголовки > Предварительно скомпилированный заголовочный файл значение pch.h.
(Изменить > Найти и заменить > Найти в файлах.)
В pch.h добавьте winrt/base.h и unknwn.h .
На этом этапе рекомендуется выполнить сборку проекта, чтобы убедиться в отсутствии ошибок, прежде чем продолжить.
Создание класса для размещения элементов композиции
Чтобы разместить содержимое, созданное с помощью визуального уровня, создайте класс (CompositionHost) для управления взаимодействием и создания элементов композиции. Это потребует выполнить большую часть настройки для размещения интерфейсов API Composition. Потребуется:
Мы сделаем этот класс singleton, чтобы избежать проблем с потоками. Например, можно создать только одну очередь диспетчера для каждого потока, поэтому создание второго экземпляра CompositionHost в том же потоке вызовет ошибку.
При необходимости сверьтесь с полным кодом в конце руководства, чтобы убедиться в том, что весь код добавлен в соответствующе места при работе с этим руководством.
Добавьте новый файл класса в проект.
Добавьте заголовки и операторы using, необходимые для взаимодействия композиции.
Измените класс, чтобы использовать шаблон singleton.
В CompositionHost.h объявите частные переменные-члены DispatcherQueueController и DesktopWindowTarget для Compositor.
Добавьте общедоступный метод для инициализации объектов взаимодействия композиции.
В методе Initialize вызываются методы EnsureDispatcherQueue, CreateDesktopWindowTarget и CreateCompositionRoot. Эти методы создаются на следующих шагах.
Создайте очередь диспетчера в потоке, который будет использовать Windows Composition.
Необходимо создать Compositor в потоке с очередью диспетчера, поэтому этот метод вызывается первым во время инициализации.
Зарегистрируйте окно приложения в качестве цели композиции.
Создайте корневой контейнер для размещения визуальных объектов.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок.
Эти методы настраивают компоненты, необходимые для взаимодействия между визуальным уровнем UWP и интерфейсами API Win32. Теперь вы можете добавить содержимое в приложение.
Добавление элементов композиции
Теперь, когда инфраструктура настроена, можно создать содержимое Composition, которое необходимо отобразить.
В этом примере вы добавите код, создающий квадрат SpriteVisual произвольного цвета с анимацией, которая удаляет его после небольшой задержки.
Добавьте элемент композиции.
Создание и отображение окна
Теперь можно добавить кнопку и содержимое композиции UWP в пользовательский интерфейс Win32.
В методе InitInstance измените размер создаваемого окна. (В этой строке измените CW_USEDEFAULT, 0 на 900, 672 .)
В функции WndProc добавьте case WM_CREATE в блок параметров message. В этом случае инициализируется CompositionHost и создается кнопка.
Кроме того, в функции WndProc обработайте нажатие кнопки, чтобы добавить элемент композиции в пользовательский интерфейс.
Добавьте case BTN_ADD в блок параметров wmId в блоке WM_COMMAND.
Теперь можно выполнить сборку приложения и запустить его. При необходимости сверьтесь с полным кодом в конце руководства, чтобы убедиться в том, что весь код добавлен в соответствующе места.
Если запустить приложение и нажать кнопку, в пользовательском интерфейсе должны отобразиться анимированные квадраты.
Что-то я решил молодость вспомнить. Перед тем, как меня понесло в сторону Perl, юниксов и всякой функциональщины, я долгое время игрался с сями, ассемблером и WinAPI. Сейчас все это начинает потихоньку забываться, а жаль, потому что, как мы уже выясняли, знать всякие низкоуровневые вещи полезно.
Для написания кода я буду использовать Windows XP, запущенный под Ubuntu Linux в VirtualBox, и среду разработки Visual Studio 2005. Если вы тоже не сидите под Windows, советую выбрать такую же конфигурацию, поскольку более поздние версии Visual Studio и Windows требуют крайне много ресурсов. Обязательно установите гостевые дополнения, это позволит использовать в Windows такое же разрешение экрана, что и в хост-системе. Если даже 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, а одним из преимуществ этого подхода является возможность писать очень компактные программки.
Давайте разберемся, как это делается:
Теперь, если вы напишите в Main.cpp код:
Чтобы при создании каждого нового проекта не повторять описанные выше шаги, закройте проект и сохраните его в архиве с названием типа project_template.zip. Теперь попробуем на основе этого проекта создать программу, которая что-то делает. Разархивируйте проект, переименуйте его каталог из Project в MsgBox, откройте проект в Visual Studio. Введите следующий код:
Заметьте, что VisualStudio может дополнять имена процедур, если при их вводе нажать Ctr+пробел. Для сохранения кода используйте сочетание Ctr+S. При вводе аргументов процедур отображается подсказка.
Если теперь вы запустите программу, то увидите примерно следующее:
Размер exe-шника при этом составил 2 Кб. Можно уменьшить его до 1 Кб, добавив в самом начале кода строку:
Этим мы говорим компилятору объединить несколько секций исполняемого файла в одну. Но мне кажется, что это уже перебор, файл и так получился крохотный. Есть и другие приемы, но нам вполне хватит описанных выше.
В заключение хочется отметить, что приведенный код успешно компилируется MinGW и запускается под Wine:
$ i586-mingw32msvc-gcc -s -DUNICODE msgbox.c -o msgbox.exe$ wine msgbox.exe
Правда, в результате получается exe-шник, содержащий «мусор», избавление от которого выходит за рамки этого поста.
Собственно, это все, о чем я хотел сегодня рассказать. В качестве домашнего задания можете почитать документацию к MessageBox на MSDN. Попробуйте отобразить окна с различными иконками и кнопками, а также по коду возврата определить, какая из кнопок была нажата.
Как всегда, буду рад ответить на ваши вопросы. И заодно скажите, насколько вообще все это вам интересно?
Поскольку мне всё равно пришлось ставить Visual Studio Community для того, чтобы установить Windows Kits для работы с WinAPI, то я решил не использовать MingW, а доустановить C++ build tools и использовать их для компиляции. В этом случае придётся переделать задачи (tasks) и настройки VSCode.
Хорошее описание нашёл здесь, его и буду использовать в данной заметке.
Нам потребуется
1. Естественно нам потребуется сама программа VSCode.
2. В Visual Studio Community должен быть установлен компонент Desktop development with C++ :
Чтобы проверить успешную установку, достаточно вызвать Developer Command Prompt for VS 2019 (файл VsDevCmd.bat ) из Пуска. Там нужно запустить файл cl.exe . Вывод консоли должен быть без ошибок:
3. Для VSCode должно быть установлено дополнение (расширение) Microsoft C/C++
Настройка
4. В Проводнике открываем рабочую папку проекта и, удерживая Shift , нажимаем правую кнопку мыши, после чего выбираем Open PowerShell window here
5. В открывшемся окошке PowerShell запускаем VSCode, для этого нужно набрать code . и нажать Enter :
9. Открываем палитру команд с помощью комбинации клавиш Ctrl + Shift + P
10. Список большой, поэтому проще ввести часть слова и выбрать нужную команду Edit Configurations UI из списка:
11. В конфигурации необходимо проверить, а, при необходимости, установить путь для компилятора:
12. Внесём изменения в файл settings.json :
13. Ранее я уже создавал файл Задач tasks.json, поэтому сейчас я добавлю к нему новые строчки:
14. Чтобы у нас была возможность запустить проект на отладку, можно использовать файл launch.json . Но я не хочу создавать такой файл для каждого проекта каждый раз, поэтому сделаю глобальную конфигурацию. Для этого я добавлю строчки в файл settings.json :
Благодаря этому, при нажатии F5 , проект будет откомпилирован, а потом запущен сразу после этого. Просто запустить, без отладки, можно комбинацией Ctrl + F5
Читайте также: