Windows h c что это
КАК быстро освоить API?
Чтобы понять что мы будем изучать, предлагаю вам на минутку перенестись в далёкие 80-ые годы теперь уже прошлого века! То были времена безраздельного правления злого волшебника DOSa. До появления доброй феи — оконной оболочки Windows труд угнетённых программистов был тяжёлым и рутинным. Подобно рудокопам, пробивающим себе дорогу в каменной породе железными молотками, писали они свои программы. Большинство программ — утилиты, базы данных, информационные системы — создавались тогда в текстовом режиме — унылом и беспросветном, где существует только 16 цветов и где экран — крохотное поле 80X25 символов. Те же смельчаки, которые решались предоставить пользователю графический интерфейс, были настоящими героями.
Почему? Ну, во-первых, никаких специальных функций для работы с графикой в DOS не было и в помине, и практически каждому разработчику приходилось либо писать свои собственные библиотеки или классы для работы с графикой, каждый раз изобретая велосипед, либо использвать те, что создали его коллеги. Это был тихий ужас! Писать графические функции приходилось чуть ли не не ассмеблере, генерируя 10-й вектор прерывания. И вот печальный итог — каждая фирма создавала свои библиотеки шрифтов, картинок и элементов управления. И каждый раз, проектируя новую программу, приходилось возвращаться к той самой печке и заново придумывать интерфейс пользователя. Представьте себе, что не было никаких стандартов, и каждый программист делал интерфейс, как Бог на душу пошлёт. Так это хорошо! — Скажете вы, — никто не зависел от стандартов, навязанных Microsoft, было простор для творчества. Так-то оно так, только программисты, которые пишут непонятные программы, отвечают, что они никакие не дизайнеры и проектировать интерфейс пользователя не их задача. В результате, очень часто программы ещё худо-бедно работали, но работать в них было сущим мучением.
Бедный пользователь был вынужден каждый раз тратить драгоценное время, чтобы понять — что же программист хотел этим сказать, когда сделал именно такие кнопки и, простите, как всё это работает?
Разработчикам игр было хуже всех. Для того, чтобы написать такую игру, как DOOM, надо было опускаться к самым низам и программировать уже не столько DOS, сколько железо, напрямую обращаясь к видеопамяти PCI видеокарты — иначе не будет быстродействия, ведь тормозит обычно графика. А если вспомнить, что в составе MS-DOS никогда не было никаких драйверов, то приходилось учитывать все популярные на тот момент видеокарты, программируя графику для каждого типа отдельно, чтобы потом игра вообще пошла! Может быть вы помните те времена, когда приходилось вручную указывать тип видеокарты, а для звуковой карты указывать IRQ, DMA и количество каналов? Какой пользователь может это знать?
С появлением Windows появилась прекрасная возможность сосредоточить свои силы не столько на внешнем обрамлении программы — кнопках, флажках и меню, сколько на её содержании, сути — том, что она реально делает. Это на самом деле важно, так как труд программистов занимает много времени, а значит, стоит больших затрат. Для разработчиков на языке СИ была написана обширная библиотека windows.h, включавшая в себя всю поднаготную Windows и позволявшая в значительной степени унифицировать процесс разработки. А следовательно, и снизить затраты на разработку ПО. Всю эту огромную спецификацию программирования под Windows назвали API (Application Programming Interface) — интерфейс прикладного программирования.
API покрывает собой всё — графику, элементы управления, системные функции, работу с устройствами и ещё многое другое. По сути, API функции это промежуточно звено между пользователем и ядром операционной системы. При работе программы API функции превращаются в системные вызовы и обрабатываются ядром ОС. Ядро в свою очередь позволяет скрыть от программиста всё железо, представляя всё hardware, как виртуальные устройства — виртуальную видеокарту, виртуальный монитор, виртуальный принтер.
Время шло, и компанией Microsoft была разработана библиотека классов MFC (Microsoft Foundation Classes), а компанией Borland OWL (Object Window Library), облачившие API в объектно-ориентированный вид. Теперь уже никто не программирует окна и графику на процедурном API с нуля, для этого есть другие, более универсальные средства. Но несмотря на это, до сих пор API поддерживается всеми библиотеками классов и очень широко используется. Ни одна библиотека классов не включает в себя всех API-функций. Очень часто разработчики решают за нас — что нам нужно, а без чего мы обойдёмся. Всегда, когда под рукой нет нужного средства, на помощь приходят API-функции. И если вы хотите, чтобы программа работала быстрее, а выполнимый файл занимал меньше места, не ленитесь использовать API-функции.
Ежегодно спецификация API пополняется новыми функциями, которые внедряются в систему с помощью патчей и сервисных пакетов. С каждой новой версией Windows, API разрастается в геометрической прогрессии, и выпускаемые по ней спецификации выглядят уже, как многотомные энциклопедии. Это основа-основ Windows. Используя нужные API-функции, вы всегда сможете сделать в всё, что захотите. Windows станет для вас ласковым ручным котёнком. Вы сможете рисовать на экране всё, что захотите, и самое удивительное — это будет работать!
В последнее время выходит великое множество литературы, посвящённой «интересным возможностям Windows», вроде «Windows глазами хаккера» или «Прикольные штучки для Windows», «Как напугать пользователя». Большинство исходных текстов в них написано именно на API.
Поскольку мы только начинаем изучение программирования для Windows, процедурный API-код подойдёт нам как нельзя лучше. Он поможет понять механизм программирования для Windows, даст нам базовые знания об этой операционной системе, её принципах и механизмах, подготовив в полной мере к изучению библиотек классов MFC и VCL. Изучив работу элементов управления, мы рассмотрим некоторые неочевидные на первый взгляд возможности Windows, заглянув за ту самую запретную черту, куда можно попасть только зная язык API.
КАК можно обойтись только windows.h?
Разработчики Windows в своё время явно погорячились, когда решили, что программист обойдётся одним единственным библиотечным файлом. Сначала было всё ничего, но он стал разрастаться и если бы вы его решили распечатать, вам пришлось бы сразу купить новый картридж для принтера и толстенную пачку бумаги. С каждой новой версией Windows число API функций всё прибывало, росло число структур, макросов и типов данных. На сегодняшний день windows.h включает в себя более 1000 одних только констант.
#define WM_QUIT 0x0012
А кроме того, прототипы ВСЕХ API-функций. Что было делать? Современный файл windows.h разделили на 3 составляющих по назначению: kernel, user и gdi. Теперь эти файлы носят такие названия:
winuser.h — объявления из модуля USER.EXE или ассоциированые с ним
wingdi.h — интерфейс графических устройств (GDI), работа с графикой
windef.h — определение фундаментальных типов данных
winnls.h — поддержка национального языка в локализованных версиях
wincon.h — консольный ввод-вывод, минующий интерфейс графических устройств
winbase.h — базовый программный интерфейс.
и другие.
В любом случае, к API-программе придётся подключать только windows.h. И это большой плюс. В программировании под DOS приходилось отдельно подключать библиотеку для работы со строками string.h, графическую библиотеку graphics.h, библиотеку ввода-вывода stdio.h. Windows.h «знает» не только все API-функции, но кроме того ещё и все функции языка СИ, которые мы использовали раньше. Многие библиотеки, которые в DOS актуальны, с началом программирования для Windows сразу отошли в мир иной это:: graphics.h, dir.h, stdio.h, conio.h, stdlib.h, process.h, dos.h. Не скоро теперь они встретятся нам на пути!
Файл windows.h существует до сих пор и пополняется новыми функциями и обновляется с каждой новой версией Visual Studio. При использовании библиотек классов MFC вы не будете его подключать, но только потому, что он уже подключён. В первых программах на API мы будем использовать именно его.
Модуль 1. Ваша первая программа Windows
В этом модуле мы напишем минимальную классическую программу для Windows. Все, что он делает, — это создание и отображение пустого окна. Эта первая программа содержит около 50 строк кода, не считая пустых строк и комментариев. Это будет нашей отправной точкой; позже мы добавим графику, текст, ввод данных пользователем и другие функции.
Если вам нужны дополнительные сведения о создании традиционного классического приложения Windows в Visual Studio, проверка пошаговое руководство. Создание традиционного классического приложения Windows (C++).

Ниже приведен полный код программы:
#ifndef UNICODE #define UNICODE #endif #include LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) < // Register the window class. const wchar_t CLASS_NAME[] = L"Sample Window Class"; WNDCLASS wc = < >; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; RegisterClass(&wc); // Create the window. HWND hwnd = CreateWindowEx( 0, // Optional window styles. CLASS_NAME, // Window class L"Learn to Program Windows", // Window text WS_OVERLAPPEDWINDOW, // Window style // Size and position CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // Parent window NULL, // Menu hInstance, // Instance handle NULL // Additional application data ); if (hwnd == NULL) < return 0; >ShowWindow(hwnd, nCmdShow); // Run the message loop. MSG msg = < >; while (GetMessage(&msg, NULL, 0, 0) > 0) < TranslateMessage(&msg); DispatchMessage(&msg); >return 0; > LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) < switch (uMsg) < case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: < PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // All painting occurs here, between BeginPaint and EndPaint. FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); EndPaint(hwnd, &ps); >return 0; > return DefWindowProc(hwnd, uMsg, wParam, lParam); >
Вы можете скачать полный проект Visual Studio из примера Windows Hello World.
Может быть полезно дать краткое описание того, что делает этот код. В последующих разделах код будет подробно рассмотрен.
- wWinMain — это точка входа в программу. При запуске программа регистрирует некоторые сведения о поведении окна приложения. Одним из наиболее важных элементов является адрес функции с именем WindowProc в этом примере. Эта функция определяет поведение окна: его внешний вид, взаимодействие с пользователем и т. д.
- Затем программа создает окно и получает дескриптор, который однозначно идентифицирует окно.
- Если окно создано успешно, программа переходит в цикл while . Программа остается в этом цикле, пока пользователь не закроет окно и не выйдет из приложения.
Обратите внимание, что программа не вызывает функцию явным WindowProc образом, хотя мы и говорили, что именно здесь определена большая часть логики приложения. Windows взаимодействует с программой, передавая ей ряд сообщений. Код внутри цикла while управляет этим процессом. Каждый раз, когда программа вызывает функцию DispatchMessage , она косвенно заставляет Windows вызывать функцию WindowProc один раз для каждого сообщения.
В этом разделе
- Создание окна
- Сообщения окна
- Написание процедуры Window
- Рисование окна
- Закрытие окна
- Управление состоянием приложения
Windows h c что это
Зачем нужен и что делает windows.h ?
В какой-то библиотеке он включается следующим фрагментом:
#ifdef _WIN32
# include
# ifdef small
/* windows.h define small to char */
# undef small
И что за _WIN32, кем и в каком месте он определяется?
Если кто прокомментирует, буду премного благодарен.
Re: Зачем нужен windows.h ?
| От: | Tazman |
| Дата: | 21.07.05 09:44 |
| Оценка: |
Здравствуйте, Chelovek_, Вы писали:
C_> Зачем нужен и что делает windows.h ?
C_> В какой-то библиотеке он включается следующим фрагментом:
Windows.h нужен для того, что бы ты мог использовать в своей программе функционал, предоставляемый операционной системой (Windows 95, 98, NT, 2000, XP).
C_>#ifdef _WIN32
C_># include
C_># ifdef small
C_> /* windows.h define small to char */
C_># undef small
C_> И что за _WIN32, кем и в каком месте он определяется?
C_> Если кто прокомментирует, буду премного благодарен.
А макрос _WIN32 генерируется компилятором, и говорит о том какая версия операционной системы используется.
_WIN16 — 16-ти разрядная
_WIN32 — 32-х разрядная
и вообще макрос _WIN?? говорит о том что используются винды.
Хорошо иметь достойных потомков, но слава принадлежит нашим предкам. (Плутарх)
Re[2]: Зачем нужен windows.h ?
| От: | Chelovek_ |
| Дата: | 21.07.05 10:02 |
| Оценка: |
C_>> Зачем нужен и что делает windows.h ?
C_>> В какой-то библиотеке он включается следующим фрагментом:
T>Windows.h нужен для того, что бы ты мог использовать в своей программе функционал, предоставляемый операционной системой (Windows 95, 98, NT, 2000, XP).
Спасибо. А не могли бы пояснить (пример какой-нибудь), что такое функционал, предоставляемый Windows ?
Например, если программа работет в консольном режиме и занимается вычислениями, она все равно использует какие-то услуги из Windows.h ?
C_>>#ifdef _WIN32
C_>># include
C_>># ifdef small
C_>> /* windows.h define small to char */
C_>># undef small
C_>> И что за _WIN32, кем и в каком месте он определяется?
C_>> Если кто прокомментирует, буду премного благодарен.
T>А макрос _WIN32 генерируется компилятором, и говорит о том какая версия операционной системы используется.
T>_WIN16 — 16-ти разрядная
T>_WIN32 — 32-х разрядная
T>и вообще макрос _WIN?? говорит о том что используются винды.
Еще раз спасибо. А можно сказать компилятору (в настройках каких-нибудь), чтобы он этот макрос не генерировал? (чисто теоретически, на практике понятно, что он много кому может быть нужен).
Re[3]: Зачем нужен windows.h ?
| От: | jazzer | Skype: enerjazzer |
| Дата: | 21.07.05 10:32 | |
| Оценка: |
Здравствуйте, Chelovek_, Вы писали:
C_>>> Зачем нужен и что делает windows.h ?
C_>>> В какой-то библиотеке он включается следующим фрагментом:
T>>Windows.h нужен для того, что бы ты мог использовать в своей программе функционал, предоставляемый операционной системой (Windows 95, 98, NT, 2000, XP).
C_> Спасибо. А не могли бы пояснить (пример какой-нибудь), что такое функционал, предоставляемый Windows ?
C_> Например, если программа работет в консольном режиме и занимается вычислениями, она все равно использует какие-то услуги из Windows.h ?
имеется в виду явное использование. То, что его рантайм использует неявно, тебя не должно волновать.
C_> Еще раз спасибо. А можно сказать компилятору (в настройках каких-нибудь), чтобы он этот макрос не генерировал? (чисто теоретически, на практике понятно, что он много кому может быть нужен).
См. документацию к твоему компилятору.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09
You will always get what you always got If you always do what you always did
Как использовать функционал windows.h для определения возможности редактировать и создавать файлы
Как использовать функционал windows.h для определения возможности редактировать и создавать файлы? В ОС Windows нельзя создавать файлы с названиями con , com1 и т.д. Нельзя редактировать системные файлы самой ОС от лица пользователя без прав администратора. Как программно задать невозможность создать/редактировать такие файлы с помощью функционала windows.h ? Я писал похожую функцию, но в ней не смог полностью ограничить пользователя.
bool is_path_good(std::string path) < std::string not_allowed[] = < "", "/", "|", "?", "*", >; std::string not_allowed_names[] = < "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9" >; bool not_in_list = true; std::string path_copy = path; for (int i = 0; i != path.length(); ++i) < path_copy[i] = tolower(path[i]); >for (int i = 0; i != 6; ++i) < if (std::string::npos != path_copy.find(not_allowed[i])) return false;; >for (int i = 0; i != 22; ++i) < if (path_copy == not_allowed_names[i]) return false;; >return true; >
На путь con вернётся false
На что-то такое: C:\my\text.txt вернётся true Есть ли в windows.h более полный функционал для обработки пути к создаваемому/редактируемому файлу?
Отслеживать
задан 17 мар 2019 в 9:58
712 2 2 золотых знака 7 7 серебряных знаков 21 21 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Microsoft предлагает вызвать GetLastError() после попытки создания файла, функция вернет NULL(пустой DWORD забитый нулями) если всё прошло нормально.

Собственно говоря, вся работа с исключительными ситуациями в WinAPI и проверка «А всё ли так?» реализуется через вызов GetLastError() чуть ли не повсеместно. Исключением является COM с его кодом ошибки HRESULT, его писали позже. Это связано с тем, что само WinApi реализовано на языке программирования Си и бросать исключения не умеет.