From Wikipedia, the free encyclopedia
windows.h is a Windows-specific header file for the C and C++ programming languages which contains declarations for all of the functions in the Windows API, all the common macros used by Windows programmers, and all the data types used by the various functions and subsystems. It defines a very large number of Windows specific functions that can be used in C. The Win32 API can be added to a C programming project by including the <windows.h> header file and linking to the appropriate libraries. To use functions in xxxx.dll, the program must be linked to xxxx.lib (or libxxxx.dll.a in MinGW). Some headers are not associated with a .dll but with a static library (e.g. scrnsave.h needs scrnsave.lib).
[edit]
There are a number of child header files that are automatically included with windows.h. Many of these files cannot simply be included by themselves (they are not self-contained), because of dependencies.
windows.h may include any of the following header files:
- stdarg.h – variable-argument functions (standard C header)
- windef.h – various macros and types
- winnt.h – various macros and types (for Windows NT) [1]
- basetsd.h – various types [2]
- guiddef.h – the
GUID
type [3] - ctype.h – character classification (standard C header)
- string.h – strings and buffers (standard C header)
- winbase.h – kernel32.dll: kernel services; advapi32.dll:kernel services(e.g. CreateProcessAsUser function), access control(e.g. AdjustTokenGroups function).
- winerror.h – Windows error codes [4]
- wingdi.h – GDI (Graphics Device Interface) [5]
- winuser.h – user32.dll: user services, inline resource macro(e.g. MAKEINTRESOURCE macro [6]), inline dialog macro(e.g. DialogBox function [7]). [8]
- winnls.h – NLS (Native Language Support)
- wincon.h – console services
- winver.h – version information [9]
- winreg.h – Windows registry [10]
- winnetwk.h – WNet (Windows Networking) [11]
- winsvc.h – Windows services and the SCM (Service Control Manager)
- imm.h – IME (Input Method Editor)
[edit]
- cderr.h –
CommDlgExtendedError
function error codes - commdlg.h – Common Dialog Boxes
- dde.h – DDE (Dynamic Data Exchange)
- ddeml.h – DDE Management Library
- dlgs.h – various constants for Common Dialog Boxes
- lzexpand.h – LZ (Lempel-Ziv) compression/decompression
- mmsystem.h – Windows Multimedia
- nb30.h – NetBIOS
- rpc.h – RPC (Remote procedure call)
- shellapi.h – Windows Shell API
- wincrypt.h – Cryptographic API
- winperf.h – Performance monitoring
- winresrc.h – used in resources
- winsock.h – Winsock (Windows Sockets), version 1.1
- winspool.h – Print Spooler
- winbgim.h – Standard graphics library
OLE and COM[edit]
- ole2.h – OLE (Object Linking and Embedding)
- objbase.h – COM (Component Object Model)
- oleauto.h – OLE Automation
- olectlid.h – various GUID definitions
Macros[edit]
Several macros affect the behavior of windows.h.
- UNICODE – when defined, this causes TCHAR to be a synonym of WCHAR instead of CHAR[12], and all type-generic API functions and messages that work with text will be defined to the -W versions instead of the -A versions. (It is similar to the windows C runtime’s _UNICODE macro.)
- RC_INVOKED – defined when the resource compiler (RC.EXE) is in use instead of a C compiler.
- WINVER – used to enable features only available in newer operating systems. Define it to 0x0501 for Windows XP, and 0x0600 for Windows Vista.
- WIN32_LEAN_AND_MEAN – used to reduce the size of the header files and speed up compilation. Excludes things like cryptography, DDE, RPC, the Windows Shell and Winsock.
See also[edit]
- Windows.pas
From Wikipedia, the free encyclopedia
windows.h is a Windows-specific header file for the C and C++ programming languages which contains declarations for all of the functions in the Windows API, all the common macros used by Windows programmers, and all the data types used by the various functions and subsystems. It defines a very large number of Windows specific functions that can be used in C. The Win32 API can be added to a C programming project by including the <windows.h> header file and linking to the appropriate libraries. To use functions in xxxx.dll, the program must be linked to xxxx.lib (or libxxxx.dll.a in MinGW). Some headers are not associated with a .dll but with a static library (e.g. scrnsave.h needs scrnsave.lib).
[edit]
There are a number of child header files that are automatically included with windows.h. Many of these files cannot simply be included by themselves (they are not self-contained), because of dependencies.
windows.h may include any of the following header files:
- stdarg.h – variable-argument functions (standard C header)
- windef.h – various macros and types
- winnt.h – various macros and types (for Windows NT) [1]
- basetsd.h – various types [2]
- guiddef.h – the
GUID
type [3] - ctype.h – character classification (standard C header)
- string.h – strings and buffers (standard C header)
- winbase.h – kernel32.dll: kernel services; advapi32.dll:kernel services(e.g. CreateProcessAsUser function), access control(e.g. AdjustTokenGroups function).
- winerror.h – Windows error codes [4]
- wingdi.h – GDI (Graphics Device Interface) [5]
- winuser.h – user32.dll: user services, inline resource macro(e.g. MAKEINTRESOURCE macro [6]), inline dialog macro(e.g. DialogBox function [7]). [8]
- winnls.h – NLS (Native Language Support)
- wincon.h – console services
- winver.h – version information [9]
- winreg.h – Windows registry [10]
- winnetwk.h – WNet (Windows Networking) [11]
- winsvc.h – Windows services and the SCM (Service Control Manager)
- imm.h – IME (Input Method Editor)
[edit]
- cderr.h –
CommDlgExtendedError
function error codes - commdlg.h – Common Dialog Boxes
- dde.h – DDE (Dynamic Data Exchange)
- ddeml.h – DDE Management Library
- dlgs.h – various constants for Common Dialog Boxes
- lzexpand.h – LZ (Lempel-Ziv) compression/decompression
- mmsystem.h – Windows Multimedia
- nb30.h – NetBIOS
- rpc.h – RPC (Remote procedure call)
- shellapi.h – Windows Shell API
- wincrypt.h – Cryptographic API
- winperf.h – Performance monitoring
- winresrc.h – used in resources
- winsock.h – Winsock (Windows Sockets), version 1.1
- winspool.h – Print Spooler
- winbgim.h – Standard graphics library
OLE and COM[edit]
- ole2.h – OLE (Object Linking and Embedding)
- objbase.h – COM (Component Object Model)
- oleauto.h – OLE Automation
- olectlid.h – various GUID definitions
Macros[edit]
Several macros affect the behavior of windows.h.
- UNICODE – when defined, this causes TCHAR to be a synonym of WCHAR instead of CHAR[12], and all type-generic API functions and messages that work with text will be defined to the -W versions instead of the -A versions. (It is similar to the windows C runtime’s _UNICODE macro.)
- RC_INVOKED – defined when the resource compiler (RC.EXE) is in use instead of a C compiler.
- WINVER – used to enable features only available in newer operating systems. Define it to 0x0501 for Windows XP, and 0x0600 for Windows Vista.
- WIN32_LEAN_AND_MEAN – used to reduce the size of the header files and speed up compilation. Excludes things like cryptography, DDE, RPC, the Windows Shell and Winsock.
See also[edit]
- Windows.pas
windows.h является Windows-конкретный файл заголовков для языка C программирования, который содержит заявления для всех функций в Windows API, все общие макросы, которые используются программистами окон, и все типы данных, используемых различными функциями и подсистем. Он определяет большое количество окон конкретные функции, которые могут быть использованы в С. Win32 API могут быть добавлены в проект программирования C, включив <windows.h> заголовка файла и ссылки на соответствующие библиотеки. Для использования функции в XXXX. DLL, программа должна быть увязана с XXXX. Lib (или Lib XXXX. В MinGW). Некоторые заголовки не связаны с расширением. DLL, но при статической библиотеки (например, scrnsave.h scrnsave.lib потребности).
Есть несколько файлов ребенка заголовок, который автоматически входит в windows.h. Многие из этих файлов не может быть просто включен сами по себе, из-за зависимостей.
windows.h может включать любую из следующих файлов заголовок:
excpt.h — Обработка исключений
stdarg.h — переменная аргумент функции (стандартный заголовок C)
windef.h — различные макросы и типы
winnt.h — различные макросы и типы (для Windows NT)
basetsd.h — различные типы
guiddef.h — тип GUID
ctype.h — характер классификации (стандартный заголовок C)
string.h — строк и буферов (стандартный заголовок C)
winbase.h — Kernel32.dll: ядро услуги
Winerror.h — коды ошибок Windows
WINGDI.H — GDI (Graphics Device Interface)
WINUSER.H — user32.dll: пользователь услугами
winnls.h — NLS (Native Language Support)
wincon.h — консоль услуги
winver.h — информация о версии
winreg.h — реестр Windows
winnetwk.h — Wnet (Windows Networking)
Winsvc.h — Windows Services и SCM (Service Control Manager)
imm.h — IME (редактор метода ввода)
Дополнительная включает в себя:
cderr.h — CommDlgExtendedError кодов функция ошибок
commdlg.h — общих диалоговых окон
dde.h — DDE (Dynamic Data Exchange)
ddeml.h — DDE Управление библиотека
dlgs.h — различные константы для общих диалоговых окон
lzexpand.h — LZ (Зив-Зива) компрессии / декомпрессии
mmsystem.h — Windows Multimedia
nb30.h — NetBIOS
rpc.h — RPC (Remote Procedure Call)
shellapi.h — оболочки Windows API
wincrypt.h — Cryptographic API
winperf.h — мониторинг эффективности
winresrc.h — используется в ресурсах
winsock.h — Winsock (Windows Sockets), версия 1.1
winsock2.h — Winsock (Windows Sockets), версия 2
winspool.h — Диспетчер очереди печати
OLE и COM:
ole2.h — OLE (Object Linking и вложение)
objbase.h — COM (Component Object Model)
oleauto.h — OLE Automation
olectlid.h — различные GUID определений
[Править] Макросы
Несколько макросов влияют на поведение windows.h.
UNICODE — определить, когда это приводит к TCHAR быть синонимом WCHAR вместо CHAR, и все тип-родовых функций API и сообщений, работа с текстом будет определен-З версиях вместо-версии. (Это похоже на Windows _UNICODE макроса C Runtime’s.)
RC_INVOKED — определить, когда ресурс компилятора (Rc.exe) используется вместо компилятора C.
WINVER — используется для включения функций доступны только в более новых операционных систем. Определить ее 0x0501 для Windows XP, и 0x0600 для Windows Vista.
WIN32_LEAN_AND_MEAN — используется для уменьшения размера файлов заголовков и ускорить компиляцию. За исключением вещей, как криптография, DDE, RPC, Windows Shell и Winsock.
windows.h[edit | edit source]
The primary C header file for accessing the Win32 API is the <windows.h>
header file. To make a Win32 executable, the first step is to include this header file in your source code. The windows.h header file should be included before any other library include, even the C standard library files such as stdio.h or stdlib.h. This is because the windows.h file includes macros and other components that may modify, extend, or replace things in these libraries. This is especially true when dealing with UNICODE, because windows.h will cause all the string functions to use UNICODE instead. Also, because many of the standard C library functions are already included in the Windows kernel, many of these functions will be available to the programmer without needing to load the standard libraries. For example, the function sprintf
is included in windows.h automatically.
[edit | edit source]
There are a number of header files that are automatically included with windows.h. Many of these files cannot simply be included by themselves, because of dependencies. The windows.h header file is actually a relatively small file, that provides conditional inclusion for a number of other header files, definitions of a few important macros, etc.
For a list of child header files visit———-
http://en.wikipedia.org/wiki/Windows.h
[edit | edit source]
This section will talk about some other interesting header files and libraries that can be included with your project, but which are not included by default with windows.h.
windows.h Macros[edit | edit source]
This section will briefly detail some of the changes that the user can make in the windows.h structure at compile time using macros.
WIN32_LEAN_AND_MEAN[edit | edit source]
The WIN32_LEAN_AND_MEAN macro causes several of the child headers to not be included in the build. This can help to speed up the compilation process.
UNICODE and _UNICODE[edit | edit source]
These macros, which we will discuss later, can generally be used interchangeably, but are frequently both defined together. These cause the program to be compiled with UTF-16 encoded strings instead of ASCII encoded strings. UTF-16 is one internationalized encoding based on the UNICODE standard and allows for more characters than the American ASCII encoding, although UTF-8 is often preferred in modern programming.
WINVER and _WIN32_WINNT[edit | edit source]
You must set these to a number greater or equal to 0x500 or you will not get some of the useful functions that are in Windows 2000 (and thus in any modern Windows) but were not in Windows 98.
Next Chapters[edit | edit source]
- Handles and Data Types
От: |
Chelovek_ |
||
Дата: | 21.07.05 08:48 | ||
Оценка: |
|
Зачем нужен и что делает windows.h ?
В какой-то библиотеке он включается следующим фрагментом:
#ifdef _WIN32
# include <windows.h>
# 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 <windows.h>
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 <windows.h>
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_> Еще раз спасибо. А можно сказать компилятору (в настройках каких-нибудь), чтобы он этот макрос не генерировал? (чисто теоретически, на практике понятно, что он много кому может быть нужен).
См. документацию к твоему компилятору.
Re[3]: Зачем нужен windows.h ?
От: |
EyeOfHell
|
eyeofhell.habr.ru | |
Дата: | 21.07.05 17:04 | ||
Оценка: |
День добрый.
А не могли бы пояснить (пример какой-нибудь), что такое функционал, предоставляемый Windows ?
Например, если программа работет в консольном режиме и занимается вычислениями, она все равно использует какие-то услуги из Windows.h ?
Там содержаться типы, выходящие за рамки стандарта C++ и использующиеся в Windows: HANDLE, HWND, UMSG итд.
Так же там содержаться определения части системных функций и структур — CreateWindowA() и прочие.
Если программы ТОЛЬКО считает — тоесть не требует от ползователя ввода и ничего никуда не выводит, например:
void main(void)
{
int x = 1;
int y = 2;
int z = x+y*2;
}
То для такой программы Windows.h включать не обязательно. А вот как только нужно вывести на экран диалог с помошью MessageBox() — сразу же придется. Бо в стандарте C++ никакого MessageBox() не предусмотрено
С уважением, Око.
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
КАК
быстро освоить API?
КАК можно обойтись только window.h?
Вместо предисловия…
Чтобы понять что мы будем изучать, предлагаю вам на минутку перенестись в далёкие
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 одних
только констант.
Hапример:
#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 мы будем использовать именно его.
Содержание
- Библиотека windows.h
- Решение
- использование заголовков Windows
- Visual C++ и Windows файлы заголовков
- Макросы для условных объявлений
- Настройка WINVER или _ Win32 _ Winnt
- Управление упаковкой структуры
- Более быстрые сборки с меньшими файлами заголовков
- Урок №21. Заголовочные файлы
- Заголовочные файлы из Стандартной библиотеки C++
- Пишем свои собственные заголовочные файлы
- Угловые скобки (<>) vs. Двойные кавычки («»)
- Можно ли записывать определения в заголовочных файлах?
- Советы
- пошаговое руководство. создание традиционного Windows классического приложения (C++)
- Предварительные требования
- создание проекта Windows классических приложений
- создание проекта Windows desktop в Visual Studio 2019
- создание проекта Windows desktop в Visual Studio 2017
- создание проекта Windows desktop в Visual Studio 2015
- Создание кода
- Запуск классического приложения Windows
- Добавление функциональных возможностей в функцию WinMain
- Добавление функциональных возможностей в функцию WndProc
- Сборка кода
- Сборка примера
Библиотека windows.h
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Приложение или библиотека C:WINDOWSsystem32HID.DLL не является образом программы для Windows NT
Прошу помочь в решении следующего вопроса: У меня Windows XP. Во время работы компьютера.
Приложение или библиотека C:Windowssystemcmicnfg.cpl не является образом прогграммы для Windows NT
Переустановил винду (Диск пошарпоный) При запуске винды выдаёт ошибку (вложение с низу) Не.
Добавлено через 12 секунд
какие команды?
Это: WinAPI, там собрано всё на все случаи жизни.
Добавлено через 6 минут
Пример команда:
Копирование файла
CopyFile(const char *fn, const char *nf, bool flag);
Добавлено через 2 минуты
Может кто-то, ещё прототипов подкинет.
Решение
windows.h является Windows-конкретный файл заголовков для языка C программирования, который содержит заявления для всех функций в Windows API, все общие макросы, которые используются программистами окон, и все типы данных, используемых различными функциями и подсистем. Он определяет большое количество окон конкретные функции, которые могут быть использованы в С. Win32 API могут быть добавлены в проект программирования C, включив заголовка файла и ссылки на соответствующие библиотеки. Для использования функции в XXXX. DLL, программа должна быть увязана с XXXX. Lib (или Lib XXXX. В MinGW). Некоторые заголовки не связаны с расширением. DLL, но при статической библиотеки (например, scrnsave.h scrnsave.lib потребности).
Есть несколько файлов ребенка заголовок, который автоматически входит в windows.h. Многие из этих файлов не может быть просто включен сами по себе, из-за зависимостей.
Источник
использование заголовков Windows
Visual C++ и Windows файлы заголовков
Microsoft Visual C++ включает копии файлов заголовков Windows, которые были текущими в момент выпуска Visual C++. поэтому при установке обновленных файлов заголовков из пакета SDK может появиться несколько версий файлов заголовков Windows на компьютере. Если вы не гарантируете, что используете последнюю версию файлов заголовков SDK, при компиляции кода, который использует функции, появившиеся после выпуска Visual C++, вы получите следующий код ошибки: Error C2065: необъявленный идентификатор.
Макросы для условных объявлений
некоторые функции, зависящие от конкретной версии Windows объявляются с помощью условного кода. Это позволяет использовать компилятор для определения того, использует ли ваше приложение функции, которые не поддерживаются в ее целевых версиях Windows. Чтобы скомпилировать приложение, использующее эти функции, необходимо определить соответствующие макросы. В противном случае вы получите сообщение об ошибке C2065.
файлы заголовков Windows используют макросы, чтобы указать, какие версии Windows поддерживают множество программных элементов. Поэтому необходимо определить эти макросы, чтобы использовать новые функции, появившиеся в каждом основном выпуске операционной системы. (Отдельные файлы заголовков могут использовать разные макросы, поэтому при возникновении проблем с компиляцией проверьте файл заголовка, содержащий определение для условных определений.) Дополнительные сведения см. в разделе SdkDdkVer. h.
в следующей таблице описаны предпочтительные макросы, используемые в файлах заголовков Windows. Если определена _ версия нтдди, необходимо также определить _ Win32 _ Winnt.
Минимальная требуемая система | Значение для _ версии нтдди |
---|---|
Windows 10 1903 «19H1» | Нтдди _ WIN10 _ 19H1 (0x0A000007) |
Windows 10 1809 «Redstone 5» | Нтдди _ WIN10 _ RS5 (0x0A000006) |
Windows 10 1803 «Redstone 4» | Нтдди _ WIN10 _ RS4 (0x0A000005) |
Windows 10 1709 «Redstone 3» | Нтдди _ WIN10 _ RS3 (0x0A000004) |
Windows 10 1703 «Redstone 2» | Нтдди _ WIN10 _ RS2 (0x0A000003) |
Windows 10 1607 «Redstone 1» | Нтдди _ WIN10 _ RS1 (0x0A000002) |
Windows 10 1511 «пороговое значение 2» | Нтдди _ WIN10 _ Th2 (0x0A000001) |
Windows 10 1507 «пороговое значение» | Нтдди _ WIN10 (0x0A000000) |
Windows 8.1 | Нтдди _ ВИНБЛУЕ (0x06030000) |
Windows 8 | Нтдди _ WIN8 (0x06020000) |
Windows 7 | Нтдди _ WIN7 (0x06010000) |
Windows Server 2008 | Нтдди _ WS08 (0x06000100) |
Windows Vista с пакетом обновления 1 (SP1) | Нтдди _ VISTASP1 (0x06000100) |
Windows Vista | Нтдди _ VISTA (0x06000000) |
Windows Server 2003 с пакетом обновления 2 (SP2) | Нтдди _ WS03SP2 (0x05020200) |
Windows Server 2003 с пакетом обновления 1 (SP1) | Нтдди _ WS03SP1 (0x05020100) |
Windows Server 2003 | Нтдди _ WS03 (0x05020000) |
Windows XP с пакетом обновления 3 (SP3) | Нтдди _ WINXPSP3 (0x05010300) |
Windows XP с пакетом обновления 2 (SP2) | Нтдди _ WINXPSP2 (0x05010200) |
Windows XP с пакетом обновления 1 (SP1) | Нтдди _ WINXPSP1 (0x05010100) |
Windows XP | Нтдди _ WINXP (0x05010000) |
в следующих таблицах описаны другие макросы, используемые в файлах заголовков Windows.
Минимальная требуемая система | Минимальное значение для _ Win32 _ Winnt и winver |
---|---|
Windows 10 | _ Win32 _ WinNT _ WIN10 (0x0A00) |
Windows 8.1 | _ Win32 _ WinNT _ винблуе (0x0603) |
Windows 8 | _ Win32 _ WinNT _ WIN8 (0x0602) |
Windows 7 | _ Win32 _ WinNT _ win7 (0x0601) |
Windows Server 2008 | _ Win32 _ WinNT _ WS08 (0x0600) |
Windows Vista | _ Win32 _ WinNT _ Vista (0x0600) |
Windows сервер 2003 с SP1, Windows XP с пакетом обновления 2 (SP2) | _ Win32 _ WinNT _ WS03 (0x0502) |
Windows сервер 2003, Windows XP | _ Win32 _ WinNT _ WinXP (0x0501) |
Минимальная требуемая версия | Минимальное значение для _ Win32 _ IE |
---|---|
Internet Explorer 11,0 | _ Win32 _ IE _ IE110 (0x0A00) |
Internet Explorer 10.0 | _ Win32 _ IE _ IE100 (0x0A00) |
Internet Explorer 9.0 | _ Win32 _ IE _ IE90 (0x0900) |
Internet Explorer 8,0 | _ Win32 _ IE _ IE80 (0x0800) |
Internet Explorer 7.0 | _ Win32 _ IE _ IE70 (0x0700) |
Internet Explorer 6,0 SP2 | _ Win32 _ IE _ IE60SP2 (0x0603) |
Internet Explorer 6,0 SP1 | _ Win32 _ IE _ IE60SP1 (0x0601) |
Internet Explorer 6.0 | _ Win32 _ IE _ IE60 (0x0600) |
Internet Explorer 5,5 | _ Win32 _ IE _ IE55 (0x0550) |
Internet Explorer 5,01 | _ Win32 _ IE _ IE501 (0x0501) |
Internet Explorer 5,0, 5.0 a, 5.0 b | _ Win32 _ IE _ IE50 (0x0500) |
Настройка WINVER или _ Win32 _ Winnt
Эти символы можно определить с помощью # инструкции define в каждом исходном файле или путем указания параметра/d компилятора, поддерживаемого Visual C++.
Например, чтобы задать WINVER в исходном файле, используйте следующую инструкцию:
#define WINVER 0x0502
Чтобы задать _ Win32 _ WinNT в исходном файле, выполните следующую инструкцию:
#define _WIN32_WINNT 0x0502
Чтобы установить _ Win32 _ WinNT с помощью параметра компилятора/d, используйте следующую команду:
cl-c/d _ WIN32 _ WinNT = 0x0502 Source. cpp
Сведения об использовании параметра компилятора/D см. в разделе /d (определения препроцессора).
обратите внимание, что некоторые функции, появившиеся в последней версии Windows, могут быть добавлены в пакет обновления для предыдущей версии Windows. Таким образом, для установки пакета обновления может потребоваться определить _ Win32 _ WinNT со значением для следующей основной версии операционной системы. например, функция жетдллдиректори была введена в Windows Server 2003 и условно определена, если _ WIN32 _ WINNT — 0x0502 или более поздней версии. эта функция также была добавлена в Windows XP с пакетом обновления 1 (SP1). таким образом, если вы определили _ WIN32 _ WINNT как 0x0501 для Windows XP, вы бы пропустили функции, определенные в Windows XP с пакетом обновления 1 (SP1).
Управление упаковкой структуры
Проекты должны быть скомпилированы для использования упаковки структуры по умолчанию, что в настоящее время составляет 8 байт, поскольку размер самого крупного целого типа составляет 8 байт. это гарантирует, что все типы структуры в файлах заголовков компилируются в приложение с тем же выравниванием, что и Windows API. Это также гарантирует, что структуры с 8-байтовыми значениями правильно выровнены и не будут приводить к ошибкам выравнивания для процессоров, обеспечивающих выравнивание данных.
Дополнительные сведения см. в разделе /Zp (Выравнивание члена структуры) или Pack.
Более быстрые сборки с меньшими файлами заголовков
можно уменьшить размер файлов заголовков Windows, исключив некоторые менее распространенные объявления API, как показано ниже.
определение _ экономичности WIN32 _ и _ среднего значения для исключения api-интерфейсов, таких как шифрование, DDE, RPC, оболочка и Windows сокеты.
Источник
Урок №21. Заголовочные файлы
Обновл. 11 Сен 2022 |
По мере увеличения размера программ весь код уже не помещается в нескольких файлах, записывать каждый раз предварительные объявления для функций, которые мы хотим использовать, но которые находятся в других файлах, становится всё утомительнее и утомительнее. Хорошо было бы, если бы все предварительные объявления находились в одном месте, не так ли?
Заголовочные файлы из Стандартной библиотеки C++
Рассмотрим следующую программу:
Результат выполнения программы:
Как правило, в заголовочных файлах записываются только объявления, без определений. Следовательно, если cout только объявлен в заголовочном файле iostream, то где же он определяется? Ответ: в Стандартной библиотеке С++, которая автоматически подключается к вашему проекту на этапе линкинга.
Пишем свои собственные заголовочные файлы
Теперь давайте вернемся к примеру, который мы обсуждали на предыдущем уроке. У нас было два файла: add.cpp и main.cpp.
Примечание: Если вы создаете все файлы заново, то не забудьте добавить add.cpp в свой проект, чтобы он был подключен к компиляции.
Мы использовали предварительное объявление, чтобы сообщить компилятору, что такое add(). Как мы уже говорили, записывать в каждом файле предварительные объявления используемых функций — дело не слишком увлекательное.
И здесь нам на помощь приходят заголовочные файлы. Достаточно просто написать один заголовочный файл и его можно будет повторно использовать в любом количестве программ. Также и вносить изменения в такой код (например, добавление еще одного параметра) гораздо легче, нежели чем шерстить по всем файлам в поисках используемых функций.
Написать свой собственный заголовочный файл не так уж и сложно. Заголовочные файлы состоят из двух частей:
Директивы препроцессора — в частности, header guards, которые предотвращают вызов заголовочного файла больше одного раза из одного и того же файла (об этом детально на следующем уроке).
Содержимое заголовочного файла — набор объявлений.
Чтобы использовать этот файл в main.cpp, вам сначала нужно будет подключить его к проекту.
main.cpp, в котором мы подключаем add.h:
add.cpp остается без изменений:
Если вы получили ошибку от компилятора, что add.h не найден, то убедитесь, что имя вашего файла точно «add.h». Вполне возможно, что вы могли сделать опечатку, например, просто «add» (без «.h») или «add.h.txt» или «add.hpp».
Если вы получили ошибку от линкера, что функция аdd() не определена, то убедитесь, что вы корректно подключили add.cpp к вашему проекту (и к компиляции тоже)!
Угловые скобки (<>) vs. Двойные кавычки («»)
Вы, наверное, хотите узнать, почему используются угловые скобки для iostream и двойные кавычки для add.h. Дело в том, что, используя угловые скобки, мы сообщаем компилятору, что подключаемый заголовочный файл написан не нами (он является «системным», т.е. предоставляется Стандартной библиотекой С++), так что искать этот заголовочный файл следует в системных директориях. Двойные кавычки сообщают компилятору, что мы подключаем наш собственный заголовочный файл, который мы написали самостоятельно, поэтому искать его следует в текущей директории нашего проекта. Если файла там не окажется, то компилятор начнет проверять другие пути, в том числе и системные директории.
Правило: Используйте угловые скобки для подключения «системных» заголовочных файлов и двойные кавычки для ваших заголовочных файлов.
Стоит отметить, что одни заголовочные файлы могут подключать другие заголовочные файлы. Тем не менее, так делать не рекомендуется.
Еще один часто задаваемый вопрос: «Почему iostream (или любой другой из стандартных заголовочных файлов) при подключении пишется без окончания «.h»?». Дело в том, что есть 2 отдельных файла: iostream.h (заголовочный файл) и просто iostream! Для объяснения потребуется краткий экскурс в историю.
Кроме того, многие библиотеки, унаследованные от языка Cи, которые до сих пор используются в C++, также были продублированы с добавлением префикса c (например, stdlib.h стал cstdlib). Функционал этих библиотек также перенесли в пространство имен std, чтобы избежать возможность возникновения конфликтов имен с пользовательскими идентификаторами.
Правило: При подключении заголовочных файлов из Стандартной библиотеки С++, используйте версию без «.h» (если она существует). Пользовательские заголовочные файлы должны иметь окончание «.h».
Можно ли записывать определения в заголовочных файлах?
Язык C++ не будет жаловаться, если вы это сделаете, но так делать не принято.
Как уже было сказано выше, при подключении заголовочного файла, всё его содержимое вставляется сразу же после строки с #include. Это означает, что любые определения, которые есть в заголовочном файле, скопируются в ваш файл.
Иногда делаются исключения для простых функций, которые вряд ли изменятся (например, где определение состоит всего лишь из одной строки).
Советы
Вот несколько советов по написанию собственных заголовочных файлов:
Всегда используйте директивы препроцессора.
Не определяйте переменные в заголовочных файлах, если это не константы. Заголовочные файлы следует использовать только для объявлений.
Не определяйте функции в заголовочных файлах.
Каждый заголовочный файл должен выполнять свое конкретное задание и быть как можно более независимым. Например, вы можете поместить все ваши объявления, связанные с файлом А.cpp в файл A.h, а все ваши объявления, связанные с B.cpp — в файл B.h. Таким образом, если вы будете работать только с А.cpp, то вам будет достаточно подключить только A.h и наоборот.
Используйте имена ваших рабочих файлов в качестве имен для ваших заголовочных файлов (например, grades.h работает с grades.cpp).
Не подключайте одни заголовочные файлы из других заголовочных файлов.
Поделиться в социальных сетях:
Источник
пошаговое руководство. создание традиционного Windows классического приложения (C++)
в этом пошаговом руководстве показано, как создать традиционное Windows классическое приложение в Visual Studio. в примере приложения, которое вы создадите, будет использоваться Windows API для вывода «Hello, Windows desktop!». «Hello, World!». Код, созданный в этом пошаговом руководстве, можно использовать в качестве шаблона для создания других классических приложений Windows.
Для краткости в тексте пропущены некоторые операторы кода. В разделе Построение кода в конце документа показан полный код.
Предварительные требования
Компьютер под управлением Microsoft Windows 7 или более поздних версий. Для обеспечения оптимальной среды разработки рекомендуется использовать Windows 10.
Базовые значения об использовании интегрированной среды разработки Visual Studio. Если вы уже использовали классические приложения для Windows, вы, вероятно, справитесь. Общие сведения см. в обзоре возможностей интегрированной среды разработки Visual Studio.
Основные навыки владения языком C++. Не волнуйтесь, мы не будем делать ничего сложного.
создание проекта Windows классических приложений
чтобы создать первый проект Windows desktop, выполните следующие действия. в процессе работы вы вводите код рабочего Windows приложения. Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio, используйте селектор Версия. Он находится в верхней части оглавления на этой странице.
создание проекта Windows desktop в Visual Studio 2019
В главном меню выберите Файл > Создать > Проект, чтобы открыть диалоговое окно Создание проекта.
в верхней части диалогового окна задайте для параметра язык значение C++, задайте для параметра платформа значение Windows и задайте для параметра Project тип значение рабочий стол.
Нажмите кнопку Создать, чтобы создать проект.
В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). В поле имя введите имя файла, например хелловиндовсдесктоп. cpp. Нажмите кнопку Добавить.
Visual C и плюсом, а также параметр файла c плюсом/с выделенным.» title=»Добавить CPP файл в Десктопапп Project» data-linktype=»relative-path»>
Теперь проект создан и исходный файл открыт в редакторе. Чтобы продолжить, перейдите к созданию кода.
создание проекта Windows desktop в Visual Studio 2017
В меню Файл выберите команду Создать, а затем пункт Проект.
в левой области диалогового окна создание Project разверните узел установленные > Visual C++ и выберите пункт Windows рабочий стол. в средней области выберите мастер рабочего стола Windows.
В поле имя введите имя проекта, например десктопапп. Нажмите кнопку ОК.
Visual C плюс плюс > Windows рабочего стола, выбранный параметр «мастер настольных систем Windows» и десктопапп введено в текстовом поле «имя».» title=»Назовите проект Десктопапп.» data-linktype=»relative-path»>
в диалоговом окне Windows рабочего стола Project в разделе тип приложения выберите Windows приложение (.exe). В поле Дополнительные параметры выберите Пустой проект. Убедитесь, что предварительно скомпилированный заголовок не выбран. Нажмите кнопку ОК, чтобы создать проект.
В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). В поле имя введите имя файла, например хелловиндовсдесктоп. cpp. Нажмите кнопку Добавить.
Visual C и плюсом, а также параметр файла c плюсом/с выделенным.» title=»Добавить CPP файл в Десктопапп Project» data-linktype=»relative-path»>
Теперь проект создан и исходный файл открыт в редакторе. Чтобы продолжить, перейдите к созданию кода.
создание проекта Windows desktop в Visual Studio 2015
В меню Файл выберите команду Создать, а затем пункт Проект.
в левой области диалогового окна создание Project разверните узел установленные > шаблоны > Visual C++, а затем выберите пункт Win32. В средней области выберите шаблон Проект Win32.
В поле имя введите имя проекта, например десктопапп. Нажмите кнопку ОК.
> Visual C плюс плюс > win32, выделенный параметр win32 Project и десктопапп, введенные в текстовом поле имя.» title=»Назовите проект Десктопапп.» data-linktype=»relative-path»>
На странице Обзор мастера приложений Win32 нажмите кнопку Далее.
на странице Параметры приложений в разделе тип приложения выберите Windows приложение. В разделе Дополнительные параметры снимите флажок предкомпилированный заголовок, а затем выберите пустой проект. Чтобы создать проект, нажмите кнопку Готово.
В Обозреватель решений щелкните правой кнопкой мыши проект десктопапп, выберите Добавить, а затем выберите новый элемент.
В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). В поле имя введите имя файла, например хелловиндовсдесктоп. cpp. Нажмите кнопку Добавить.
Visual C и плюсом, а также параметр файла c плюсом/с выделенным.» title=»Добавить CPP файл в Десктопапп Project» data-linktype=»relative-path»>
Теперь проект создан и исходный файл открыт в редакторе.
Создание кода
далее вы узнаете, как создать код для Windows классического приложения в Visual Studio.
Запуск классического приложения Windows
точно так же, как у каждого приложения C и C++ должна быть main функция в качестве начальной точки, каждое Windows классическое приложение должно иметь WinMain функцию. WinMain имеет следующий синтаксис:
Сведения о параметрах и возвращаемом значении этой функции см. в разделе WinMain Entry Point.
Дополнительные сведения см. в разделе Процедуры окна.
Добавление функциональных возможностей в функцию WinMain
Дополнительные сведения о полях приведенной выше структуры см. в разделе вндклассекс.
зарегистрируйте WNDCLASSEX Windows, чтобы он знал о вашем окне и способах отправки в него сообщений. Воспользуйтесь функцией RegisterClassEx и передайте структуру класса окна в качестве аргумента. Этот _T макрос используется, так как мы используем TCHAR тип.
на этом этапе окно было создано, но нам по-прежнему нужно сообщить Windows, чтобы сделать его видимым. Вот что делает этот код:
для обработки сообщений сначала нужно добавить цикл обработки сообщений для прослушивания сообщений, которые Windows отправляет. Когда приложение получает сообщение, этот цикл отправляет его в вашу WndProc функцию для обработки. Цикл обработки сообщений напоминает приведенный ниже код.
Дополнительные сведения о структурах и функциях, используемых в цикле обработки сообщений, см. в разделах, посвященных MSG, GetMessage, TranslateMessageи DispatchMessage.
На этом этапе функция WinMain должна напоминать приведенный ниже код.
Добавление функциональных возможностей в функцию WndProc
Одно важное сообщение для обработчика — WM_PAINT сообщение. Приложение получает сообщение, WM_PAINT когда часть его отображаемого окна необходимо обновить. Это событие может возникать, когда пользователь перемещает окно перед окном, а затем снова перемещает его. Приложение не знает, когда происходят эти события. только Windows знает, поэтому оно уведомляет ваше приложение с WM_PAINT сообщением. При первом отображении окна его все должно быть обновлено.
Для обработки сообщения WM_PAINT сначала вызовите метод BeginPaint, далее обработайте логику расположения текста, кнопок и других элементов управления в окне, а затем вызовите метод EndPaint. для приложения логика между начальным вызовом и завершающим вызовом отображает строку «Hello, Windows desktop!» «Hello, World!». В следующем коде функция Text используется для вывода строки.
HDC в коде — это обработчик контекста устройства, который используется для рисования в клиентской области окна. Используйте BeginPaint функции и EndPaint для подготовки и завершения рисования в клиентской области. BeginPaint Возвращает маркер контекста устройства отображения, используемый для рисования в клиентской области. EndPaint завершает запрос на рисование и освобождает контекст устройства.
Сборка кода
Как обещано, вот полный код для рабочего приложения.
Сборка примера
Удалите код, введенный в хелловиндовсдесктоп. cpp в редакторе. Скопируйте этот пример кода и вставьте его в хелловиндовсдесктоп. cpp:
В меню Построение выберите Построить решение. Результаты компиляции должны появиться в окне вывод в Visual Studio.
Чтобы запустить приложение, нажмите клавишу F5. окно, содержащее текст «Hello, Windows desktop!» должно отображаться в левом верхнем углу экрана.
Поздравляем! вы выполнили это пошаговое руководство и создали традиционное Windows классическое приложение.
Источник
ссылка
http://blog.csdn.net/fengningning/article/details/2306650?locationNum=1&fps=1
деконструкция windows.h
Комментарий в начале — это описание заголовочного файла:
/*++ BUILD Version: 0001 Increment this if a change has global effects
Copyright (c) 1985-1997, Microsoft Corporation
Module Name:
windows.h
Abstract:
Master include file for Windows applications.
--*/
Этот документ, похоже, не претерпел серьезных изменений и все еще является первой версией. «Увеличьте это значение, если изменение имеет глобальный эффект», что, вероятно, означает «если изменение имеет глобальный эффект, добавьте изменение в этот файл заголовка». В самих словах нет двусмысленности, но вы можете подумать, что если это я, я определенно не буду делать никаких заявлений об изменении этого файла — причина очень проста, это усложнит трансплантацию кода, и есть другие недостатки. фактор. Итак, это предложение, вероятно, то, что разработчики Microsoft сказали «себе». В абстрактной части написано: «Главный включаемый файл для приложений Windows», поэтому нет необходимости объяснять это.
#ifndef _WINDOWS_
#define _WINDOWS_
Этот вид макроопределения должен быть наиболее распространенным, одна из функций — предотвращение повторного включения.
#ifndef WINVER
#define WINVER 0x0400
#else
#if defined(_WIN32_WINNT) && (WINVER < 0x0400) && (_WIN32_WINNT > 0x0400)
#error WINVER setting conflicts with _WIN32_WINNT setting
#endif
#endif
Макрос WINVER связан с версией Windows, то есть, когда переменная макроса принимает разные значения, она соответствует разным версиям Windows. Соответствующие инструкции в документации Platform SDK следующие:
Windows Server 2003 WINVER>=0x0502
Windows XP WINVER>=0x0501
Windows 2000 WINVER>=0x0500
Windows NT 4.0 WINVER>=0x0400
Windows Me WINVER>=0x0500
Windows 98 WINVER>=0x0410
Windows 95 WINVER>=0x0400
(Как проверить номер версии моей операционной системы Windows? Один из способов представлен ниже: Вызов диспетчера задач -> Справка -> О диспетчере задач, сделайте то же самое в Windows XP Вы можете обнаружить, что номер версии — 5.1, в то время как это 5.2 в Windows server 2003 и 5.0 в Windows 2000. Ха-ха, действительно, это согласуется с описанием в документации Platform SDK!) Макрос _WIN32_WINNT на самом деле представляет номер версии. Следовательно, если вы определяете этот макрос одновременно, но он несовместим с определением WINVER, то компилятор выдаст ошибку «Настройка WINVER конфликтует с _WIN32_WINNT».
#if(WINVER >= 0x0500)
#pragma message ("")
#pragma message ("NOTE: WINVER has been defined as 0x0500 or greater which enables")
#pragma message ("Windows NT 5.0 and Windows 98 features. When these headers were released,")
#pragma message ("Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.")
#pragma message ("")
#pragma message ("For this release when WINVER is defined as 0x0500 or greater, you can only")
#pragma message ("build beta or test applications. To build a retail application,")
#pragma message ("set WINVER to 0x0400 or visit http://www.microsoft.com/msdn/sdk")
#pragma message ("to see if retail Windows NT 5.0 or Windows 98 headers are available.")
#pragma message ("")
#pragma message ("See the SDK release notes for more information.")
#pragma message ("")
#endif
Если заданный WINVER> = 0x0500, минимально необходимая версия Windows — Windows NT 5.0 (Windows 2000) и Windows 98. В это время компилятор выдаст серию сообщений, определенных с помощью #pragma message, в качестве приглашения при компиляции.
#ifndef _INC_WINDOWS
#define _INC_WINDOWS
#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif
/* If defined, the following flags inhibit definition
* of the indicated items.
*
* NOGDICAPMASKS - CC_*, LC_*, PC_*, CP_*, TC_*, RC_
* NOVIRTUALKEYCODES - VK_*
* NOWINMESSAGES - WM_*, EM_*, LB_*, CB_*
* NOWINSTYLES - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_*
* NOSYSMETRICS - SM_*
* NOMENUS - MF_*
* NOICONS - IDI_*
* NOKEYSTATES - MK_*
* NOSYSCOMMANDS - SC_*
* NORASTEROPS - Binary and Tertiary raster ops
* NOSHOWWINDOW - SW_*
* OEMRESOURCE - OEM Resource values
* NOATOM - Atom Manager routines
* NOCLIPBOARD - Clipboard routines
* NOCOLOR - Screen colors
* NOCTLMGR - Control and Dialog routines
* NODRAWTEXT - DrawText() and DT_*
* NOGDI - All GDI defines and routines
* NOKERNEL - All KERNEL defines and routines
* NOUSER - All USER defines and routines
* NONLS - All NLS defines and routines
* NOMB - MB_* and MessageBox()
* NOMEMMGR - GMEM_*, LMEM_*, GHND, LHND, associated routines
* NOMETAFILE - typedef METAFILEPICT
* NOMINMAX - Macros min(a,b) and max(a,b)
* NOMSG - typedef MSG and associated routines
* NOOPENFILE - OpenFile(), OemToAnsi, AnsiToOem, and OF_*
* NOSCROLL - SB_* and scrolling routines
* NOSERVICE - All Service Controller routines, SERVICE_ equates, etc.
* NOSOUND - Sound driver routines
* NOTEXTMETRIC - typedef TEXTMETRIC and associated routines
* NOWH - SetWindowsHook and WH_*
* NOWINOFFSETS - GWL_*, GCL_*, associated routines
* NOCOMM - COMM driver routines
* NOKANJI - Kanji support stuff.
* NOHELP - Help engine interface.
* NOPROFILER - Profiler interface.
* NODEFERWINDOWPOS - DeferWindowPos routines
* NOMCX - Modem Configuration Extensions
*/
Весь следующий контент используется для определения некоторых других файлов заголовков, которые необходимо включить, и, конечно, также включается другая информация.
_MSC_VER Этот макрос определяет версию компилятора, связанная информация выглядит следующим образом:
C Compiler version 6.0 600
C/C++ compiler version 7.0 700
Visual C++, Windows, version 1.0 800
Visual C++, 32-bit, version 1.0 800
Visual C++, Windows, version 2.0 900
Visual C++, 32-bit, version 2.x 900
Visual C++, 32-bit, version 4.0 1000
Visual C++, 32-bit, version 5.0 1100
Visual C++, 32-bit, version 6.0 1200
Этот макрос должен быть определен, #pragma once указывает компилятору включать этот файл заголовка не более одного раза в процессе компиляции.
Что интересно, так это следующий большой комментарий, в котором объясняется, что когда макрос _MSC_VER определен и его номер версии> = 1020, то перечисленные рядом флаги не Можно определить.
#if defined(RC_INVOKED) && !defined(NOWINRES)
#include <winresrc.h>
#else
#if defined(RC_INVOKED)
/* Turn off a bunch of stuff to ensure that RC files compile OK. */
#define NOATOM
#define NOGDI
#define NOGDICAPMASKS
#define NOMETAFILE
#define NOMINMAX
#define NOMSG
#define NOOPENFILE
#define NORASTEROPS
#define NOSCROLL
#define NOSOUND
#define NOSYSMETRICS
#define NOTEXTMETRIC
#define NOWH
#define NOCOMM
#define NOKANJI
#define NOCRYPT
#define NOMCX
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_MIPS_) && !defined(_X86_) && defined(_M_IX86)
#define _X86_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_MRX000)
#define _MIPS_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_ALPHA)
#define _ALPHA_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_PPC)
#define _PPC_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_M68K)
#define _68K_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_MPPC)
#define _MPPC_
#endif
#ifndef _MAC
#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif
#ifndef RC_INVOKED
#if ( _MSC_VER >= 800 )
#pragma warning(disable:4001)
#pragma warning(disable:4201)
#pragma warning(disable:4214)
#pragma warning(disable:4514)
#endif
#include <excpt.h>
#include <stdarg.h>
#endif /* RC_INVOKED */
Этот раздел немного длинный, но поскольку он интегрирован, его неизбежно анализировать вместе.
Макрос RC_INVOKED, кажется, является основой этого абзаца, поэтому начните с него. RC (компилятор ресурсов) определяет этот макрос, позволяя выборочно компилировать различные части файла заголовка ресурса. Зачем нужна такая необходимость? Когда вы думаете, использовать ли компилятор C или компилятор RC для компиляции файлов заголовков ресурсов, вы должны столкнуться с этой проблемой. Поскольку оператор определения, поддерживаемый RC, является только подмножеством компилятора C, если вы выбираете компиляцию с RC, вы должны быть осторожны, чтобы не записывать файлы заголовков ресурсов с синтаксисом, который RC не поддерживает.
Макрос NO_WINRES фактически определен в файле заголовка winresrc.h, а содержимое файла winresrc.h действительно очень мало:
#ifndef _WINRESRC_
#define _WINRESRC_
#include <winuser.rh>
#include <commctrl.rh>
#include <dde.rh>
#include <winnt.rh>
#include <dlgs.h>
#include <winver.h>
#endif
Ха-ха, прочитав, понять нетрудно.
Следующие определения # если! определено (68K) && !defined(MPPC) … связано с платформой.Так как большинство людей (включая меня) могут работать только на аппаратной платформе, такой как X86, эти определения не должны быть слишком небрежными.
Если RC_INVOKED не определен и _MSC_VER (номер версии компилятора)> = 800, то несколько предупреждений, связанных с версией компилятора, будут отключены. Если макрос RC_INVOKED не определен, необходимо включить два файла заголовков excpt.h и stdarg.h (excpt.h — это недокументированный файл заголовка, который содержит некоторые определения о SEH (структурированной обработке исключений); stdarg. h определяет макросы типа ANSI для функций с несколькими параметрами), так почему в этом случае должны быть включены эти два файла заголовков? Это объясняется в Platform SDK: «RC не поддерживает некоторые предопределенные макросы ANSI C-типа (например,DATE, FILE, LINE, STDC, TIME, TIMESTAMPEtc.) », а два заголовочных файла excpt.h и stdarg.h действительно определяют некоторые макросы ANSI-типа C. Поэтому, чтобы избежать ошибок компиляции, только когда RC не используется (то есть макрос RC_INVOKED не определен) Включайте только эти файлы заголовков.
#include <windef.h>
#include <winbase.h>
#include <wingdi.h>
#include <winuser.h>
Это самые важные и основные файлы заголовков, включенные в windows.h:
определение типа windef.h-basic
winbase.h — функция ядра
функция интерфейса устройства wingdi.h-graphics
winuser.h — функции пользовательского интерфейса
#ifdef _MAC
DECLARE_HANDLE(HKEY);
typedef HKEY *PHKEY;
#endif
Функции в windows.h:
СсылкаФункции windows.h
1. Получите текущий рабочий каталог
char* _getcwd( char *buffer, int maxlen );
// Функция: Получить текущий рабочий каталог.
// Заголовочный файл: #include <direct.h>
// Возвращаемое значение: успешно возвращает указатель на буфер
// Возвращаем NULL в случае ошибки и устанавливаем для errno одно из следующих трех значений:
// У ENODEV нет такого устройства
// ENOMEM недостаточно памяти
// ERANGE результат вне допустимого диапазона
// Примечание: когда первый параметр равен NULL, установка длины maxlen второго параметра недопустима, и функция
// Используйте malloc для выделения достаточного количества памяти, вам нужно передать возвращаемое значение функции в функцию free () для
// Освобождаем память. Если первый параметр не равен NULL, указанной maxlen длины недостаточно, и функция возвращает
// Неправильно, установите для errno значение ERANGE
2. Измените текущий рабочий каталог.
int _chdir( const char *dirname );
// Функция: изменить текущий рабочий каталог.
// Заголовочный файл: #include <direct.h>
// Возвращаемое значение: возврат 0 в случае успеха
// Возвращаем -1 в случае неудачи и устанавливаем errno следующим образом:
// ENOENT Путь не существует
3. Обход файла (поиск)
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
// Функция: предоставить первый файл, который в целом соответствует указанной записи в спецификации файлов. Функция _findnext обычно используется позже
// Подсчитываем последующее использование для завершения обхода файла по определенной общей формуле.
// Заголовочный файл: #include <io.h>
// Параметр: спецификация файла-файла, может содержать подстановочные знаки
// fileinfo-буфер информации о файле
// Возвращаемое значение: единственный поисковый дескриптор возвращен успешно
// Возвращаем -1 в случае ошибки и устанавливаем errno на следующее значение:
// ENOENT этот универсальный шаблон не может быть сопоставлен
// EINVAL недопустимое имя файла
// Примечание: описание _finddata_t
struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};
// среди них :
// unsigned atrrib: место хранения атрибутов файла. Он хранит беззнаковый блок, используемый для представления файла
// Атрибуты. Атрибуты файла представлены битами, в основном следующим образом: _A_ARCH (архив),
// _A_HIDDEN (скрытый), _A_NORMAL (обычный), _A_RDONLY (только для чтения),
// _A_SUBDIR (папка), _A_SYSTEM (система). Они находятся в <io.h>
// Определенный макрос можно использовать напрямую, и его значение фактически является целым числом без знака
// (Просто этот целочисленный тип должен быть степенью 2, чтобы гарантировать, что только один бит равен 1, а другой
// бит равен 0). Поскольку это битовое представление, когда файл имеет несколько атрибутов, он часто
// Получаем синтез нескольких атрибутов с помощью побитового ИЛИ. Например, только для чтения + скрытые + системные свойства,
// Должно быть: _A_HIDDEN | _A_RDONLY | _A_SYSTEM.
// time_t time_create: time_t здесь тип переменной, используемый для хранения времени создания файла.
// time_t time_access: время последнего доступа к файлу.
// time_t time_write: время последнего изменения файла.
// _fsize_t size: размер файла. _Fsize_t здесь должен быть эквивалентен целому числу без знака, что означает
// Количество байтов в файле.
// имя символа [_MAX_FNAME]: имя файла для файла. Здесь _MAX_FNAME - постоянный макрос, который находится в заголовке <stdlib.h>
// Определено в файле, это означает максимальную длину имени файла.
int _findnext( long handle, struct _finddata_t *fileinfo );
// Функция: в соответствии с общим правилом из предыдущего _findfirst найти следующий файл, который соответствует универсальному, и использовать его как основу
// изменяем значение в fileinfo
// Заголовочный файл: #include <io.h>
// Параметр: длинный дескриптор поиска дескриптора (обычно возвращается _findfirst () непосредственно перед ним)
// fileinfo-буфер информации о файле
// Возвращаемое значение: возврат 0 в случае успеха
// Возвращаем -1 в случае ошибки и устанавливаем errno на следующее значение:
// ENOENT больше не имеет документов, соответствующих общему
int _findclose( long handle );
// Функция: закрыть дескриптор поиска и освободить соответствующие ресурсы
// Заголовочный файл: #include <io.h>
// Параметр: длинный дескриптор поиска (обычно возвращается _findfirst () непосредственно перед ним)
// Возвращаемое значение: возврат 0 в случае успеха
// Возвращаем -1 в случае ошибки и устанавливаем errno на следующее значение:
// ENOENT больше не имеет документов, соответствующих общему
4. Создайте каталог.
int _mkdir( const char *dirname );
// Функция: Создать новый каталог, имя каталога - dirname.
// Заголовочный файл: #include <direct.h>
// Возвращаемое значение: возврат 0 в случае успеха
// Возвращаем -1 в случае ошибки и устанавливаем для errno одно из следующих трех значений:
// Разрешение EACCESS не разрешено
// EEXIST Каталог уже существует
// ENOENT нет такого файла или каталога
5. Удалите каталог.
int _rmdir( const char *dirname );
// Функция: удалить каталог с именем dirname.
// Заголовочный файл: #include <direct.h>
// Возвращаемое значение: возврат 0 в случае успеха
// Возвращаем -1 в случае ошибки и устанавливаем для errno одно из следующих трех значений:
// EACCESS: разрешение не разрешено
// ENOTEMPTY: имя каталога не является папкой; или папка не пуста; или
// где dirname - текущая рабочая папка; или dirname
// как корневая папка;
// ENOENT: нет такого файла или каталога
6. Прочие операции
int _access( const char *path, int mode );
// Функция: определение прав доступа к файлу / каталогу.
// Заголовочный файл: #include <io.h>
// Параметр: путь к файлу или каталогу
// настройки режима-разрешения, значения следующие:
// 00 Existence only
// 02 Write permission
// 04 Read permission
// 06 Read and write permission
int _chdrive( int drive );
// Функция: изменить текущий рабочий диск.
// Заголовочный файл: #include <direct.h>
// Возвращаемое значение: возврат 0 в случае успеха
// возвращаем -1 в случае неудачи
// Примечание: описание параметра
// drive = 1: Drive A
// drive = 2: Drive B
// диск = 3: диск C ...
char* _getdcwd( int drive, char *buffer, int maxlen );
// Функция: Получить текущий рабочий путь указанного диска.
// Заголовочный файл: #include <direct.h>
// Возвращаемое значение: успешно возвращает указатель на буфер
// Возвращаем NULL в случае ошибки и устанавливаем для errno одно из следующих трех значений:
// У ENODEV нет такого устройства
// ENOMEM недостаточно памяти
// ERANGE результат вне допустимого диапазона
// Примечание: когда первый параметр равен NULL, эта функция устанавливает errno в ERANGE