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[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
Содержание
- Стандартные функции Windows
- 8. Приложения
- Типы данных в файле windows.h
- Имена констант в файле windows.h
- Имена параметров функций
Стандартные функции Windows
В программе используются функции, описанные в различных заголовочных файлах из стандартной библиотеки windows.h:
LoadIcon – загружает значок (Icon) для использования в программе;
LoadCursor – загружает курсор (Cursor) мыши;
GetStockObject – получает графический объект – кисть (Stock);
RegisterClassEx – регистрирует класс окна;
CreateWindow – создает окно на основе класса окна;
ShowWindow – выводит окно на экран;
UpdateWindow – заставляет окно перерисовать свое содержимое;
GetMessage – получает сообщение из очереди сообщений;
TranslateMessage – преобразует некоторые сообщения, полученные с помощью клавиатуры;
DispatchMessage – отправляет сообщение оконной процедуре;
BeginPaint – инициирует начало процесса рисования окна;
GetClientRect – получает размер рабочей области окна;
DrawText – выводит на экран строку текста;
EndPaint – прекращает рисование окна;
PostQuitMessage – вставляет сообщение «Завершить» в очередь сообщений;
DefWindowProc – выполняет обработку сообщений по умолчанию.
Идентификаторы и типы данных
При программировании в среде Windows используют соглашения по именованию переменных – идентификатор переменной составляется из букв или частей слов, отражающих смысл этой переменной.
Префиксы некоторых переменных, использующихся в дальнейшем: c – символ; by –BYTE (беззнаковый символ); n –короткое целое; i –целое; cx, cy – целое (длины x и y; с означает счет – count); b или f –BOOL (булево целое, f – флаг – flag); w – WORD (беззнаковое короткое целое); l – LONG (длинное целое); dw – DWORD (беззнаковое длинное целое); fn – функция; s – строка; sz –строка, завершаемая нулем (string terminated by zero); h –описатель (handle); p – указатель (pointer).
Идентификаторы, написанные прописными буквами, задаются в заголовочных файлах Windows. Двух- или трехбуквенный префикс, за которым следует символ подчеркивания, показывает основную категорию ее принадлежности, например: CS – опция стиля класса (Class Style); IDI – идентификационный номер иконки (ID Icon); IDC – идентификационный номер курсора; WS – стиль окна (windows style); WM – cообщение окна.
Аналогичен смысл новых типов данных, например, тип UINT – 32-разрядное беззнаковое целое (unsigned int), PSTR – указатель на строку символов (pointer string), т.е. char*; LONG – длинное целое.
WndProc возвращает значение типа LRESULT – Long RESULT. Функция WinMain получает тип WINAPI (как и любая другая функция Windows), а функция WndProc получает тип CALLBACK – эти идентификаторы являются ссылкой на особую последовательность вызовов функций, которая имеет место между ОС Windows и ее приложением.
В программе использованы структуры данных: MSG – структура сообщения (message); WNDCLASSEX – структура класса окна; PAINTSTRUCT – структура рисования; RECT – структура прямоугольника.
При обозначении переменных структуры пользуются именем самой структуры и строчными буквами, например, переменная msg – структура типа MSG; wndclass – структура типа WNDCLASSEX.
В программе используются идентификаторы, предназначенные для разных типов описателей (handles): HINSTANCE – описатель экземпляра (instance) самой программы; HWND – описатель окна (handle to a window); HDC – описатель контекста устройства.
Основная программа
Для работы программы подключен файл windows.h, содержащий заголовочные файлы с объявлениями функций, структур и числовых констант. Далее следует декларация прототипа функции WndProc – «оконная процедура» для окна программы Hello.
Основной функцией (точкой входа программы), аналогом стандартной функции main языка Си для Windows является функция WinMain:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow);
использующая последовательность вызовов WINAPI и возвращающая ОС Windows целое значение. В ней используются четыре параметра:
hInstance – описатель экземпляра – уникальное число, идентифицирующее программу;
hPrevInstance – предыдущий (previous) экземпляр; если в данный момент не было загружено копий программы, то hPrevInstance = 0 или NULL;
szCmdLine – указатель на строку, в которой содержатся любые параметры, переданные в программу из командной строки;
iCmdShow – число, показывающее, каким должно быть выведено на экран окно в начальный момент; обычно: SW_SHOWNORMAL (1) – вывод окна нормального размера, SW_SHOWMINNOACTIVE (7) – окно должно быть изначально свернутым; префикс SW означает «показать окно» (show window).
Регистрация класса окна
Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки поступающих сообщений.
Перед созданием окна необходимо зарегистрировать класс окна, вызвав функцию RegisterClassEx, это расширенная версия функции Register-Class (Ex – extended – расширенный). Параметр функции – указатель на структуру типа WNDCLASSEX, определенную в заголовочных файлах:
typedef struct tagWNDCLASSEX <
> WNDCLASSEX;
Префиксы LP и lp означают «длинный указатель» (long pointer), приставка lpfn – «длинный указатель на функцию» (long pointer to a function); приставка cb – «счетчик байт» (counter of bytes); префикс hbr – это «описатель кисти» (handle to a brush).
Для работы WinMain необходимо определить эту структуру:
WNDCLASSEX wndclass;
наиболее важными в ней являются второе и третье от конца поля. Второе поле – имя класса окна (обычно совпадает с именем программы), третье поле – адрес оконной процедуры, использующейся для всех окон, созданных на основе этого класса. Другие поля описывают характеристики окон, создаваемых на основе этого класса окна.
Поле cbSize равно длине структуры. Инструкция:
wndclass.style = CS_HREDRAW | CS_VREDRAW;
осуществляет объединение двух идентификаторов «стиля класса» с помощью поразрядной операции «ИЛИ» (|). В заголовочных файлах Windows, идентификаторы, начинающиеся с префикса CS, задаются в виде 32-разрядной константы, только один из разрядов которой установлен в 1. Например, CS_VREDRAW (горизонтальный) – 0x0001, а CS_HREDRAW (вертикальный) – 0x0002 показывают, что все окна должны целиком перерисовываться при изменении размеров окна. Эти идентификаторы называют «поразрядными флагами» (bit flags).
Третье поле wndclass.lpfnWndProc = WndProc; устанавливает оконную процедуру данного окна.
Следующие две инструкции:
wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0;
резервируют дополнительное пространство, которое может быть использовано программой, в данной программе эта возможность не используется – значения равны 0, иначе в этом поле было бы установлено «число байт» резервируемой памяти.
В следующем поле – описатель экземпляра программы, который является одним из параметров WinMain:
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
устанавливают значки (иконки), которые появляется на панели задач и в заголовке окна. Для получения описателя стандартного значка первый параметр устанавливается в NULL; при загрузке пользовательского значка этот параметр должен быть равен описателю экземпляра программы. Второй параметр определяется в заголовочных файлах, значок IDI_APPLICATION – это маленькое изображение окна. Функция LoadIcon возвращает описатель этого значка для полей wndclass.hIcon и wndclass.hIconSm, имеющих тип HICON («описатель значка» – handle to an icon).
Функция LoadCursorзагружает стандартный курсор IDC_ARROW и возвращает его описатель полю hCursor:
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
Поле hbrBackground задает цвет фона рабочей области окон (префикс hbr означает «описатель кисти» – handle to a brush). Кисть – графический объект, используемый для закрашивания области. В Windows имеется несколько стандартных кистей. В инструкции
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
функция GetStockObject возвращает описатель белой кисти.
Следующее поле задает меню класса окна, т.к. в нашем случае оно отсутствует – поле установлено в NULL:
На последнем этапе классу должно быть присвоено имя, которое может совпадать с именем программы, хранящемся в переменной szAppName:
После того как инициализированы все поля структуры, регистрируем класс окна, вызывая функцию: RegisterClassEx (&wndclass);
Создание окна
Класс окна определяет основные характеристики окна, что позволяет использовать один и тот же класс для создания множества различных окон.
Функция CreateWindow создает окно, детализируя информацию о нем, которая должна передаваться функции в качестве параметров:
hwnd = CreateWindow (szAppName, – имя класса окна;
«First Example», – заголовок окна;
WS_OVERLAPPEDWINDOW, – стиль окна;
CW_USEDEFAULT, – начальное положение по x
CW_USEDEFAULT, и по y;
CW_USEDEFAULT, – начальные размеры по x
CW_USEDEFAULT, и по y;
NULL, – описатель родительского окна;
NULL, – описатель меню окна;
hInstance, – описатель экземпляра программы;
NULL); – параметры создания.
Параметр «имя класса окна» – szAppName содержит строку «Hello», являющуюся именем зарегистрированного класса окна, этот параметр связывает окно с классом окна.
Окно, созданное программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна.
WS_OVERLAPPEDWINDOW – стандартный «стиль окна»; «заголовок окна» – текст, который выводится в строке заголовка.
Параметры «начальное положение по x и по y» задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана; идентификатор CW_USEDEFAULT задает по умолчанию начальное положение для перекрывающегося окна; аналогично задаются значения параметров «начальные размеры по x и по y».
Поскольку у нашего окна отсутствует родительское окно, параметр «описатель родительского окна» – NULL; аналогично «описатель меню окна» – NULL (у окна нет меню).
В параметр «описатель экземпляра программы» помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain.
Значение «параметры создания» установлено в NULL, при необходимости этот параметр используется в качестве указателя на данные, к которым программа в дальнейшем могла бы обратиться.
Функция CreateWindow возвращает описатель созданного окна, который хранится в переменной hwnd типа. У каждого окна в Windows имеется его описатель, который используется для ссылки на это окно. При создании нескольких окон каждое из них имеет свой описатель, являющийся одним из важнейших, которыми оперирует программа для Windows.
Для многих функций Windows в качестве параметра требуется hwnd, благодаря чему Windows знает, к какому окну применить эту функцию.
Отображение окна
К тому времени, когда функция CreateWindow возвращает управление программе, окно уже создано внутри Windows, однако на экране монитора оно еще не появилось. Выводит окно на экран функция
ShowWindow (hwnd, iCmdShow);
параметр hwnd – описатель созданного окна; параметр iCmdShow – задает начальный вид окна на экране: SW_SHOWNORMAL (1) – на экран выводится обычное окно, фон рабочей области закрашивается заданной в классе окна кистью; SW_SHOWMINNOACTIVE (7) – окно не выводится, а на панели задач появляются его имя и иконка.
Функция UpdateWindow (hwnd); выполняет перерисовку рабочей области окна, посылая сообщение WM_PAINT в оконную процедуру (WndProc).
Цикл обработки сообщений
Программа получает информацию от пользователя через клавиатуру и мышь. Для каждой программы, работающей в данный момент, Windows поддерживает «очередь сообщений» (message queue). Когда происходит ввод информации, она преобразуется в «сообщение», которое помещается в эту очередь.
Программа извлекает сообщения из очереди, выполняя блок соответствующих команд, известный как «цикл обработки сообщений» (message loop):
while (GetMessage (&msg, NULL, 0, 0)) <
TranslateMessage (&msg);
DispatchMessage (&msg);
Переменная msg – структура типа MSG, определенная следующим образом:
Источник
8. Приложения
Исходные тексты любого приложения Windows включают файл windows.h:
Этот файл содержит множество определений типов данных, макросов, прототипов функций, констант и т. д.
Наряду с этим файлом вы можете включить в приложения и другие, знакомые вам по MS-DOS, include-файлы, такие, как stdlib.h и string.h.
Если в проекте Borland C++ for Windows версии 3.1 указывается, что создается приложение Windows, компилятор определяет символ _WINDOWS. Этот символ влияет на включаемые файлы стандартной библиотеки Си. В частности, из include-файлов могут быть исключены прототипы функций, не совместимых с Windows.
Перед включением файла windows.h для выполнения более строгой проверки типов рекомендуется определить символ STRICT:
После включения этой строки многие типы данных определяются по-другому. В частности, все многочисленные идентификаторы ресурсов Windows, такие, как идентификатор контекста, идентификатор окна и т. п., определяются как различные типы данных. При этом вы не сможете по ошибке выполнить, например, присваивание идентификатора окна переменной, предназначенной для хранения идентификатора контекста отображения или идентификатора меню.
Есть целый набор символов, при определении которых из файла windows.h будут исключены определения функций или типов данных, связанных с отдельными подсистемами Windows. Вы можете определить эти символы для ускорения обработки файла windows.h при трансляции (разумеется, если соответствующие подсистемы не используются вашим приложением). Приведем список некоторых из таких символов.
Символ | Что исключает |
NOATOM | Прототипы функций для работы с атомами |
NOCLIPBOARD | Прототипы функций, идентификаторы сообщений и константы для работы с универсальным буфером обмена Clipboard |
NOCOMM | Прототипы функций, структуры и константы для работы с портом последовательной передачи данных |
NOCTLMGR | Прототипы функций для работы с диалоговыми панелями, структуры и константы для работы с диалоговыми панелями, сообщения WM_CTLCOLOR, WM_GETFONT, WM_SETFONT, стили органов управления |
NOCOLOR | Прототипы функций GetSysColor, SetSysColor и константы с префиксом COLOR |
NODRAWTEXT | Прототип функции DrawText и связанные с этой функцией константы |
NOGDI | Все определения функций и констант для графического интерфейса GDI |
NOHELP | Функцию WinHelp, структуры и константы для нее |
NOICONS | Идентификаторы встроенных пиктограмм |
NOKERNEL | Прототип функции WinMain, определения всех функций ядра Windows, структур данных и константы |
NOMB | Прототип функций MessageBox, MessageBeep и константы для них |
NOMENUS | Прототипы функций и константы для работы с меню |
NOMETAFILE | Прототипы функций и константы для работы с метафайлами |
NOSYSCOMMANDS | Константы системных команд с префиксом SC |
NOUSER | Прототипы и определения констант для пользовательских функций (эти функции относятся к программному интерфейсу Windows и вызываются приложениями) |
NOVIRTUALKEYCODES | Коды виртуальных клавиш |
NOWINMESSAGES | Определения кодов сообщений Windows |
NOWINSTYLES | Константы для определения стилей окон |
Для разработки приложений Windows используется большое количество типов данных и констант, определенных в таких файлах, как windows.h, commdlg.h и других. Эти типы данных как бы замещают собой стандартные типы данных языка Си.
Такая замена позволяет отделить программный интерфейс Windows от самой операционной системы Windows, с одной стороны, и от конкретных реализаций компиляторов языка Си, с другой. Например, система разработки программ Borland C++ версии 3.1 трактует тип unsigned int как беззнаковое целое размером 16 бит. В файле windows.h определен тип UNIT, который для указанной выше системы разработки отображается на тип unsigned int :
Однако при разработке 32-разрядных приложений (таких, как Windows NT) для 32-разрядных процессоров тип UINT должен иметь размер 32 бит. Если вы будете думать о типе UINT как о типе, который используется для представления беззнакового целого естественной для данного процессора длины, вы можете избежать ошибок, связанных с неправильным определением размера целого числа без знака.
Ключевое слово FAR определено так:
В 16-разрядной среде тип LPSTR отображается на дальний указатель, состоящий из селектора и смещения. В 32-разрядной среде при использовании сплошной (FLAT) модели памяти содержимое сегментных регистров устанавливается один раз при запуске приложения и в дальнейшем не изменяется (самим приложением). Для адресации в этом случае используется только 32-разрядная компонента смещения.
Если ваша программа использует тип LPSTR, при ее переносе в среду Windows NT вам не придется изменять исходные тексты, достаточно выполнить новую трансляцию. Для этой операционной системы ключевое слово FAR определено как пустое место:
Поэтому все дальние указатели, определенные с использованием этого ключевого слова, автоматически превратятся в ближние (что и требовалось).
Если бы вы определяли дальний указатель на строку символов как char _far *, вам бы пришлось удалять или переопределять ключевое слово _far.
Типы данных в файле windows.h
Файл windows.h должен включаться во все исходные файлы приложений Windows. Он содержит определение типов данных, символических имен констант и прототипы функций программного интерфейса Windows.
Для создания мобильных приложений, которые вы сможете перенести в среду Windows NT или аналогичную среду, поддерживающую программный интерфейс Windows, следует пользоваться не стандартными типами данных, реализованными в конкретной версии системы, а теми типами данных, которые определены в файле windows.h.
Приведем список базовых типов данных, определенных в файле windows.h.
Тип данных | Определение типа в файле windows.h | Описание |
BOOL | int | Булевый (двоичный) |
BYTE | unsigned char | Байт |
WORD | unsigned short | Беззнаковое целое размером 16 бит |
DWORD | unsigned long | Беззнаковое целое размером 32 бит |
UINT | unsigned int | Беззнаковое целое естественного для данной системы размера |
Заметим, что в Windows версии 3.1 изменилось определение типа данных WORD по сравнению с версией 3.0. В файле windows.h, предназначенном для разработки приложений Windows версии 3.0, тип данных WORD был определен следующим образом:
В обоих случаях (и для версии 3.0, и для версии 3.1) тип данных отображается на беззнаковое целое длиной 16 бит. Но для Windows NT типы данных unsigned int и unsigned short уже не эквивалентны. Использование вместо них типа данных WORD упростит задачу переноса исходных текстов приложений в 32-разрядную среду.
На основе приведенного выше набора базовых типов в файле windows.h определены производные типы, которые являются указателями:
Тип данных | Определение типа в файле windows.h | Описание |
PSTR | char NEAR * | Ближний указатель на символ типа char |
NPSTR | char NEAR * | Ближний указатель на символ типа char |
LPSTR | char FAR * | Дальний указатель на символ типа char |
LPCSTR | const char FAR * | Константный дальний указатель на символ типа char |
PBYTE | BYTE NEAR * | Ближний указатель на байт |
LPBYTE | BYTE FAR * | Дальний указатель на байт |
PINT | int NEAR * | Ближний указатель на int |
LPINT | int FAR * | Дальний указатель на int |
PWORD | WORD NEAR * | Ближний указатель на беззнаковое целое размером 16 бит |
LPWORD | WORD FAR * | Дальний указатель на беззнаковое целое размером 16 бит |
PLONG | long NEAR * | Ближний указатель на знаковое целое размером 32 бит |
LPLONG | long FAR * | Дальний указатель на знаковое целое размером 32 бит |
PDWORD | DWORD NEAR * | Ближний указатель на беззнаковое целое размером 32 бит |
LPDWORD | DWORD FAR * | Дальний указатель на беззнаковое целое размером 32 бит |
LPVOID | void FAR * | Дальний указатель, для которого не определен тип данных |
Файл windows.h содержит определения для многочисленных структур данных, таких, как POINT, RECT, TEXTMETRICS и т. п. Для всех структур данных определены указатели, например:
Тип данных PPOINT в зависимости от используемой модели памяти может быть как дальним, так и ближним указателем. Поэтому, для того чтобы избежать неоднозначность в тех случаях, когда вам нужен, например, дальний указатель, лучше воспользоваться типом LPPOINT.
Мы не будем перечислять все структуры данных, описанные в файле windows.h, так как их очень много. Вы можете посмотреть определения нужных вам структур непосредственно в файле windows.h, который всегда находится в каталоге с именем include.
Для использования того или иного ресурса Windows вы должны получить идентификатор нужного вам ресурса. Для получения идентификатора вызывается одна из функций программного интерфейса Windows. Например, для получения идентификатора контекста отображения можно воспользоваться функцией GetDC:
Само по себе полученное значение идентификатора не имеет для вас никакого смысла. Идентификатор должен использоваться только для ссылки на ресурс, например:
Вы не можете изменять значение идентификатора ни самостоятельно, ни с помощью каких-либо функций программного интерфейса Windows.
Некоторые ресурсы являются ограниченными, поэтому после того, как вы их использовали, эти ресурсы следует отдать Windows с помощью специально предназначенных для этого функций. Например, для того чтобы отдать идентификатор контекста отображения, следует вызвать функцию ReleaseDC:
Приведем список некоторых типов идентификаторов ресурсов:
Тип идентификатора | Описание |
GLOBALHANDLE | Идентификатор блока глобальной памяти |
HACCEL | Акселератор |
HBITMAP | Изображение в виде битового образа (bitmap) |
HBRUSH | Кисть |
HCURSOR | Курсор |
HDC | Контекст устройства |
HDRVR | Драйвер устройства |
HFONT | Шрифт |
HGDIOBJ | Объект графического интерфейса GDI |
HGLOBAL | Идентификатор блока глобальной памяти |
HICON | Пиктограмма |
HLOCAL | Идентификатор блока локальной памяти |
HMENU | Меню |
HMETAFILE | Метафайл |
HPALETTE | Палитра |
HPEN | Перо |
HRGN | Область |
HRSRC | Ресурс |
HSTR | Строка символов |
HTASK | Задача |
HWND | Окно |
LOCALHANDLE | Идентификатор блока локальной памяти |
С некоторыми перечисленными выше идентификаторами вы уже знакомы, с некоторыми вам еще только предстоит познакомиться в следующих томах «Библиотеки системного программиста».
Имена констант в файле windows.h
Файл windows.h содержит определение большого количества имен символических констант, таких, как коды сообщений, режимы работы и возможные варианты параметров для различных функций программного интерфейса Windows. Простое перечисление всех символических имен, определенных в файле windows.h, заняло бы не один десяток страниц. Так как наша книга не справочник, а скорее учебное пособие, и к тому же размер книги ограничен, мы не будем подробно описывать каждое символическое имя. Все необходимые сведения приведены в тексте вместе с описанием соответствующих функций. Здесь же мы расскажем только о префиксах символических имен.
Символические имена большинства констант, определенные в файле windows.h и других файлах, включаемых в исходные тексты приложений Windows, начинаются с префиксов, таких, как WM или WS. Имена некоторых констант не имеют таких префиксов, например OPAQUE, TRANSPARENT и т. п.
Приведем список некоторых префиксов имен констант, определенных в файле windows.h.
Префикс символического имени константы | Описание |
BI | Компрессия изображений bitmap |
BN | Коды сообщений от кнопок |
BS | Стили логических кистей |
CB | Стили органа управления Combo Box |
CBN | Коды сообщений от органа управления Combo Box |
CBS | Стили при создании органа управления Combo Box |
CE | Коды ошибок при передаче данных |
CF | Форматы универсального буфера обмена данными Clipboard |
COLOR | Системные цвета отдельных элементов пользовательского интерфейса Windows |
CS | Стили класса окна |
DRIVE | Тип диска |
DS | Стили при создании диалоговых панелей |
DT | Технология, использованная при создании устройства ввода/вывода |
DT | Режимы форматирования при выводе текста функцией DrawText |
HT | Коды, возвращаемые функцией DefWindowProc при обработке сообщения WM_NCHITTEST |
ID | Идентификаторы команд диалоговой панели |
IDC | Идентификаторы встроенных курсоров |
IDI | Идентификаторы встроенных пиктограмм |
MB | Флаги для функции MessageBox |
META | Коды для метафайлов |
MM | Режимы отображения |
СС | Способность устройства рисовать различные кривые |
OF | Константы для работы с файлами |
PS | Стили пера |
RT | Типы ресурсов |
SB | Команды и константы для полосы просмотра (Scroll Bar) |
SBS | Стили полосы просмотра |
SC | Значения системных команд, передаваемых вместе с сообщением WM_SYSCOMMAND |
SIZE | Константы для описания способа изменения размера окна |
SM | Константы для определения системных метрик |
SW | Константы для функции ShowWindow |
TA | Константы для выбора способа выравнивания текста при его выводе с помощью функций TextOut и ExtTextOut. |
VK | Коды виртуальных клавиш |
WM | Сообщения Windows |
WS | Стили окна |
WS_EX | Расширенные стили окна |
Имена параметров функций
Изобилие типов в приложениях Windows создает определенные трудности для программиста. Ему приходится постоянно думать о соответствии имен переменных типам переменных. Для облегчения работы программистов рекомендуется для всех имен параметров функций и других переменных использовать префиксы. Эти префиксы должны быть заданы маленькими буквами. Приведем список некоторых префиксов, рекомендуемых для различных типов данных:
Префикс | Тип данных |
atm | ATOM |
f | BOOL |
b | BYTE |
lpb | BYTE FAR* |
lpch | char FAR* |
dlgprc | DLGPROC |
dw | DWORD |
lpdw | DWORD FAR* |
haccl | HACCEL |
hbm | HBITMAP |
hbr | HBRUSH |
hcur | HCURSOR |
hdc | HDC |
hdrvr | HDRVR |
hdwp | HDWP |
hf | HFILE |
hfont | HFONT |
hgdiobj | HGDIOBJ |
hglb | HGLOBAL |
hhook | HHOOK |
hicon | HICON |
hinst | HINSTANCE |
hloc | HLOCAL |
hmenu | HMENU |
hmf | HMETAFILE |
hmod | HMODULE |
hkprc | HOOKPROC |
hpal | HPALETTE |
hpen | HPEN |
hrgn | HRGN |
hrsrc | HRSRC |
hstr | HSTR |
htask | HTASK |
hwnd | HWND |
n | int |
l | LONG |
lParam | LPARAM |
lpb | LPBYTE |
lpsz | LPCSTR |
lpn | LPINT |
lpl | LPLONG |
lpsz | LPSTR |
lpv | LPVOID |
lpw | LPWORD |
lResult | LRESULT |
npsz | NPSTR |
npb | PBYTE |
lppt | POINT FAR* |
lprc | RECT FAR* |
tmprc | TIMERPROC |
u | UINT |
wndenmprc | WNDENUMPROC |
wndprc | WNDPROC |
u или w | WORD |
wParam | WPARAM |
Так же как и при разработке программ для MS-DOS, при создании приложений Windows вам следует правильно выбрать модель памяти. Напомним основные различия между моделями памяти.
Модель памяти Tiny. Для этой модели создается один сегмент кода и один сегмент данных, причем суммарный размер этих сегментов не должен превышать 64 Кбайт. Эта модель памяти используется при создании загрузочных модулей с расширением имени com. Вы не можете использовать эту модель памяти при создании приложений Windows.
Модель памяти Small. Для этой модели создается один сегмент кода и один сегмент данных, причем суммарный размер этих сегментов не должен превышать 128 Кбайт. Размер массивов данных, созданных с использованием этой модели, не должен превышать 64 Кбайт. Все указатели являются ближними. Эта модель памяти пригодна для приложений Windows. Все примеры приложений, приведенные в нашей книге, созданы с использованием модели памяти Small.
Модель памяти Compact. При использовании этой модели памяти можно создать только один сегмент кода, но несколько сегментов данных. Размер массива данных не должен превышать 64 Кбайт. Для вызова функций, определенных внутри приложения, используется только компонента смещения. Для адресации данных применяются 32-разрядные адреса.
Модель памяти Huge. Эта модель памяти во всем аналогична модели Large, но допускает работу с массивами неограниченного размера.
Операционная система Windows версии 3.0 могла быть запущена в реальном режиме работы процессора. В этом случае сегменты данных моделей памяти Compact, Large и Huge оказывались зафиксированными в области реальных адресов. В защищенном режиме работы эта неприятность не наблюдается.
Большинство приложений Windows использует либо модель памяти Small, либо Medium, либо так называемую смешанная модель памяти.
Смешанная модель памяти. Для использования смешанной модели памяти в программах MS-DOS используются такие ключевые слова, как _near или _far. Приложения Windows должны пользоваться словами NEAR или FAR.
В смешанной модели памяти вы можете комбинировать ближние и дальние адреса данных и функций, добиваясь получения оптимальной производительности.
Следует отметить, что, строго говоря, вне зависимости от того, какую модель памяти вы укажете при создании проекта, все равно вам придется пользоваться смешанной моделью памяти. Даже при использовании модели памяти Small ваше приложение будет вызывать функции программного интерфейса Windows. Все эти функции в Windows версии 3.1 описаны с ключевым словом _far и расположены в сегментах, принадлежащих не вашему приложению, а операционной системе. Программа MS-DOS, созданная с использованием модели памяти Small, не может содержать дальних вызовов, так как все вызываемые ей функции расположены в одном сегменте кода, а вызовы MS-DOS выполняются через прерывания. Приложения Windows, напротив, не используют прерывания для вызова операционной системы. Они всегда (при использовании любой модели памяти) вызывают операционную систему с помощью команды дальнего вызова.
При использовании редактора текста, входящего в состав систем разработки Borland C++ for Windows версии 3.1 или Turbo C++ for Windows версии 3.1, вы можете столкнуться с невозможностью просмотра комментариев или текстовых строк, набранных с использованием символов кириллицы. Это связано с тем, что указанные выше средства используют для работы с текстом собственный шрифт, который не содержит символов кириллицы.
Вы можете выйти из положения, заменив этот в общем-то неплохой шрифт на другой, в котором есть символы кириллицы.
Для замены шрифта из главного меню системы разработки выберите меню «Options». В меню «Options» выберите строку «Environment». Затем на экране появится еще одно (!) меню, в котором надо выбрать строку «Preferences. «. На экране появится диалоговая панель «Preferences» (рис. 8.1).
Рис. 8.1. Выбор нового шрифта
По умолчанию в меню «Font» выбран шрифт BorlandTE, в котором нет символов кириллицы. Мы рекомендуем вам вместо этого шрифта выбрать шрифт Courier Cyrillic, который есть в русской версии Windows и который устанавливается практически всеми программами локализации Windows, такими, как CyrWin. К сожалению, версия 3.1 системы разработки Borland C++ for Windows не может работать со шрифтами TrueType. Этот недостаток устранен в следующей версии.
Посмотрите на исходный текст приложения Windows, приведенный в листинге 8.1. Не торопитесь делать вывод, что эта программа попала сюда случайно из учебника по языку программирования Си Кернигана и Риччи. То, что вы видите, и в самом деле приложение Windows. Вы можете легко в этом убедиться, если запустите exe-файл этого приложения, который есть на дискете (дискета продается вместе с книгой). Главное окно приложения изображено на рис. 8.2.
Листинг 8.1. Файл easywineasywin1.cpp
Рис. 8.2. Окно приложения EASYWIN1
Но есть одна маленькая тонкость. В проекте должно быть указано, что данная программа есть не что иное, как приложение Windows.
Если вы не купили дискету, прилагаемую к книге, и набрали приведенный выше текст программы самостоятельно, выберите из меню «Options» среды Borland C++ for Windows строку «Application. «. На экране появится диалоговая панель «Application Options» (рис. 8.3).
Рис. 8.3. Диалоговая панель «Application Options»
В этой диалоговой панели вам надо нажать кнопку с надписью «Windows App».
Когда вы собираете загрузочный модуль приложения, компилятор находит там вместо функции WinMain функцию main. Так как в проекте указано, что данное приложение является приложением Windows, компилятор автоматически подключает к приложению функции интерфейса EasyWin и оно становится приложением Windows.
Фактически интерфейс EasyWin полностью скрывает от программиста интерфейс Windows, предоставляя ему взамен старый добрый интерфейс консольного ввода/вывода. В программах EasyWin вы можете пользоваться всеми стандартными функциями ввода/вывода, такими, как printf, gets, getch и т. д. Дополнительно можно вызывать функции gotoxy, wherex, wherey, clrscr и clreol, которые входят в стандартную библиотеку Borland C++ для MS-DOS.
Аналогичный интерфейс предусмотрен и в системе разработки Microsoft Visual C++. Этот интерфейс называется QuickWin. Он позволяет использовать практически любые функции стандартной библиотеки транслятора для MS-DOS, в том числе графические. Создаваемое с помощью этого интерфейса приложение может работать в среде Windows в полноэкранном режиме, внешне не отличаясь от своего варианта для MS-DOS.
Зачем все это нужно? Мы так долго говорили о преимуществах Windows, а теперь снова возвратились к MS-DOS?
Возвратились, но не совсем.
Мы можем использовать функции консольного ввода/вывода, но этот вывод выполняется не на экран реального видеомонитора, а в обычное окно Windows. Наше приложение работает в защищенном режиме и может использовать все преимущества адресации расширенной памяти, доступные стандартному приложению Windows. Кроме того, в приложении можно вызывать и обычные функции программного интерфейса Windows.
Для чего же обычно используют интерфейс EasyWin?
Во-первых, для переноса старых программ в среду Windows. Если у вас есть исходные тексты программ MS-DOS, составленных на языке программирования Си, которыми вы продолжаете пользоваться и которые для ввода/вывода на экран используют только функции консольного ввода/вывода, вы сможете без особого труда сделать из этих программ приложения Windows. Для этого вам достаточно перетранслировать их в среде Borland C++ for Windows версии 3.1, указав в проекте, что нужно сделать приложение Windows. Скорее всего вам не придется менять ни одной строчки исходного кода.
Во-вторых, интерфейс EasyWin удобно использовать для создания небольших тестовых приложений, когда нужно быстро получить результат.
В качестве примера такого приложения приведем второй вариант приложения TMETRICS, предназначенного для просмотра пространственных характеристик шрифта, выбранного в контекст отображения (листинг 8.2).
Листинг 8.2. Файл easywineasywin2.cpp
В этом приложении мы создаем контекст отображения, вызывая функцию программного интерфейса Windows CreateDC. Затем мы вызываем знакомую вам функцию GetTextMetrics, определяющую метрики шрифта. Названия метрик и соответствующие численные значения выводятся в окно приложения функцией Print. Функция Print определена в нашем приложении и выглядит чрезвычайно просто благодаря применению для вывода функции printf.
Главное окно приложения изображено на рис. 8.4.
Рис. 8.4. Главное окно приложения EASYWIN2
Без малейших усилий с нашей стороны у окна появились вертикальная и горизонтальная полосы просмотра, с помощью которых можно увидеть целиком окно «виртуальной консоли».
Обратите внимание также на то, что мы вызываем в этой программе функцию программного интерфейса MessageBox.
Можно, именно так мы и поступили в нашем следующем приложении, которое выполняет такие нетипичные для приложений задачи, как перезагрузка компьютера или перезапуск операционной системы Windows (листинг 8.3).
Листинг 8.3. Файл easywineasywin3.cpp
Это приложение содержит стандартную для Windows функцию WinMain. Для инициализации интерфейса EasyWin вызывается функция _InitEasyWin, описанная в файлах stdio.h, io.h, iostream.h:
После вызова этой функции появляется окно и вы можете вызывать стандартные функции консольного ввода/вывода.
В качестве примера мы вызываем функцию GetWindowsDirectory, которая возвращает полный путь к каталогу, содержащему файлы операционной системы Windows:
Параметр lpszSysPath является указателем на буфер, в который будет записан путь к каталогу Windows. Длина буфера должна быть не менее 144 символов, она задается параметром cbSysPath.
Функция GetWindowsDirectory возвращает длину строки записанной в буфер, без учета закрывающего строку двоичного нуля. Если вы не предусмотрели буфер достаточного размера, функция возвратит требуемый размер буфера. В случае ошибки возвращается нулевое значение.
Получив строку пути к каталогу Windows, приложение отображает его на экране и предлагает меню (рис. 8.5).
Рис. 8.5. Главное окно приложения EASYWIN3
Для перезапуска Windows и перезагрузки компьютера мы использовали функцию программного интерфейса Windows с именем ExitWindows:
Старший байт параметра dwReturnCode должен быть равен нулю, младший байт должен содержать код возврата, передаваемый MS-DOS при завершении работы Windows:
Параметр | Описание |
EW_RESTARTWINDOWS | Перезапуск Windows |
EW_REBOOTSYSTEM | Завершение работы Windows и перезапуск системы. Этот код допустим только для Windows версии 3.1 и более старших версий |
Параметр wReserved зарезервирован и должен быть равен нулю.
Функция ExitWindowsExec определена в программном интерфейсе Windows версии 3.1. Она завершает работу Windows, передавая управление указанной в параметре программе MS-DOS. После завершения работы этой программы Windows запускается вновь. Приведем прототип функции ExitWindowsExec:
Параметр lpszExe является дальним указателем на строку символов, закрытую двоичным нулем, содержащую путь к запускаемой программе MS-DOS. Через параметр lpszParams запускаемой программе можно передать строку параметров. Это значение можно задать как NULL.
При невозможности завершить работу Windows или в случае появления других ошибок функция возвращает значение FALSE.
Как правило, функции ExitWindowsExec и ExitWindows используются в программах установки программного обеспечения для Windows (в инсталляторах). О том, как создавать собственные инсталляторы, мы расскажем в отдельной главе в одной из следующих книг серии «Библиотека системного программиста».
До появления такой среды разработки приложений Windows, как Borland C++ версии 2.0, отладка приложений требовала наличия двух мониторов или даже двух компьютеров. На одном мониторе отображался ход выполнения программы, другой использовался для работы приложения.
Начиная с версии 2.0 в системе разработки Borland C++ появился одноэкранный отладчик Turbo Debugger for Windows, значительно упрощающий процесс отладки приложений. Для работы этого отладчика достаточно одного компьютера и одного экрана (хотя наилучшие результаты могут быть достигнуты только с двумя компьютерами).
Самый простой способ отладки приложений Windows тем не менее вообще не требует применения отладчика. Он заключается в том, что вы вставляете в разные места исходного текста приложения вызовы функции MessageBox, с помощью которых прослеживаете ход выполнения программы. Если же вам требуется узнать содержимое каких-либо переменных, это можно сделать с помощью функции wsprintf. Вначале с помощью функции wsprintf вы преобразуете интересующее вас значение в текстовую строку, а затем выводите эту строку функцией MessageBox. В некоторых случаях достаточно ограничиться выдачей звукового сигнала, для чего можно вызвать функцию MessageBeep. Примеры вызова функций MessageBox, wsprintf и MessageBeep вы можете найти в приложениях, описанных в нашей книге.
Однако для отладки более сложных приложений вы не сможете ограничиться выдачей диагностических сообщений. Тогда, если вы программист, который только начинает создавать приложения для Windows, мы рекомендуем вам воспользоваться одноэкранным отладчиком Turbo Debugger for Windows, который входит в комплект поставки системы разработки Borland C++ for Windows версии 3.1 или Turbo C++ for Windows.
Учтите, что указанный отладчик не работает с видеоадаптером EGA. Поэтому, если у вас установлен такой видеоадаптер, мы рекомендуем заменить его на другой. Лучше всего приобрести видеоадаптер SVGA с ускорителем для Windows, в котором многие графические операции выполняются аппаратно, благодаря чему скорость вывода изображения сильно повышается. Стоимость такого видеоадаптера может составлять порядка 100 долларов. В крайнем случае на первом этапе вы можете использовать видеоадаптер VGA, однако в этом случае вам не будут доступны режимы с высоким разрешением и с большим количеством цветов.
С помощью отладчика вы сможете выполнить приложение в пошаговом режиме, выполнить обратную трассировку, установить точки прерывания, просмотреть состояние переменных, содержимое стека, файлов данных, изменить значение переменных и сделать многое другое.
Для запуска отладчика из среды разработки выберите из меню «Run» строку «Debugger». Перед этим вы можете задать параметры командной строки для отлаживаемого приложения. Для этого из указанного меню надо выбрать строку «Debugger Arguments. «.
После выбора строки «Debugger» на экране появится сообщение о загрузке отладчика, после чего экран переключится в текстовый режим. К сожалению, отладчик Turbo Debugger for Windows, который поставляется в комплекте со средой разработки Borland C++ for Windows версии 3.1, может работать только в текстовом режиме (среда разработки Borland C++ for Windows версии 4.0 содержит, помимо отдельного отладчика Turbo Debugger for Windows, отладчик, который встроен в среду разработки и работает в обычном окне Windows в графическом режиме). Несмотря на это, указанный отладчик не способен работать с видеоконтроллером EGA.
После запуска отладчика вы попадаете в среду, знакомую вам по отладчику Turbo Debugger для MS-DOS. В отладчике Turbo Debugger for Windows используются почти такие же функциональные клавиши и меню, что и в версии для MS-DOS. Из-за недостатка места в книге мы не будем описывать работу с отладчиком Turbo Debugger. Если вы разрабатывали программы для MS-DOS, вы скорее всего уже пользовались этим отладчиком. Поэтому мы ограничимся только несколькими замечаниями, которые относятся к отладке приложений Windows.
Первое замечание касается отладки функций обратного вызова, таких, как функция окна WndProc.
Если функция окна расположена в отдельном файле, для установки точки останова вам надо перейти в режим просмотра этого файла. Для просмотра модуля, расположенного в отдельном файле, выберите из меню отладчика «View» строку «Module». Вы окажитесь в диалоговой панели, с помощью которой можно выбрать имя модуля. Приложения, приведенные в нашей книге, используют для функции окна файл с именем wndproc.cpp, поэтому в появившейся диалоговой панели выберите строку «WNDPROC».
Второе замечание относится к просмотру экрана выполняющегося приложения.
Отладчик Turbo Debugger for Windows имеет дополнительные возможности по сравнению с версией для MS-DOS. В частности, с помощью этого отладчика можно протоколировать сообщения, которые получают и посылают окна вашего приложения, работать с глобальной и локальной памятью, просматривать полный список загруженных модулей, отлаживать библиотеки динамической загрузки DLL и просматривать содержимое любого селектора.
Выберите строку «Add. «. На экране появится диалоговая панель «Add window or handle to watch». В этой диалоговой панели установите переключатель «Identify by» в положение «Window proc» и в поле «Window identifier» введите имя функции окна, например wndproc. Затем нажмите кнопку «OK».
С помощью строк «Remove» и «Delete all» вы можете удалить отдельный или все идентификаторы или имена функций, для которых нужно протоколировать получаемые сообщения.
Выберите строку «Add. «. С помощью переключателя «Message class» вы можете выбрать различные классы отображаемых (протоколируемых) сообщений:
Класс сообщения | Описание |
All Messages | Все сообщения |
Mouse | Сообщения от мыши |
Window | Сообщения от системы управления окнами (такие, как WM_PAINT и WM_CREATE) |
Input | Сообщения от клавиатуры, системного меню, полос просмотра или кнопок изменения размера |
System | Системные сообщения |
Initialization | Сообщения, которые появляются при создании приложением окна или диалоговой панели |
Clipboard | Сообщения, которые создаются приложением при доступе к универсальному буферу обмена Clipboard или окну другого приложения |
DDE | Сообщения, которые возникают в результате динамического обмена данными между приложениями с использованием механизма DDE |
Non-client | Сообщения, которые создаются Windows для работы с внешней (non-client) областью окна (такие, как WM_NCHITTEST или WM_NCCREATE) |
Other | Остальные сообщения, не попавшие в перечисленные выше классы, такие, как сообщения интерфейса MDI |
Single Message | Любое выбранное вами сообщение. Символическое имя или десятичный идентификатор сообщения следует указать в поле «Single Message Name» |
С помощью переключателя «Action» вы можете задать действие, выполняемое отладчиком при перехвате сообщения. По умолчанию включен режим «Log», что соответствует протоколированию сообщения и отображению его в нижней части диалоговой панели «Windows Messages». Режим «Break» позволяет вам организовать останов приложения по сообщению.
Остальные возможности отладчика будут рассмотрены позже.
Источник
ссылка
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
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.