Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 35 стр [25 вопросов].doc
Скачиваний:
45
Добавлен:
15.06.2014
Размер:
384.51 Кб
Скачать

Метрические параметры текста. Подробности

Структура TEXTMETRIC обеспечивает полную информацию о выбранном в данный момент в контексте устройства шрифте. Вертикальный размер шрифта определяется только пятью величинами, как показано на рис. 3.3.

0 Эти величины вполне объяснимы. Значение tmInternalLeading — это величина пустого пространства, отведенного для указания специальных знаков над символом. Если это значение равно 0, то помеченные прописные буквы делаются немного меньше, чтобы специальный символ поместился внутри верхней части символа. Значение tmExternalLeading — это величина пустого пространства, которое разработчик шрифта установил для использования между строками символов. Вы можете согласиться или отклонить предложение разработчика при распределении пространства между строками текста.

1 В структуре TEXTMETRIC имеется два поля, описывающих ширину символа: tmAveCharWidth (усредненная ширина символов строки) и tmMaxCharWidth (ширина самого широкого символа шрифта). Для фиксированного шрифта эти две величины одинаковы.

2 В примерах программ этой главы используется другое значение ширины символа — средняя ширина прописных букв. Она может быть точно рассчитана как 150% от tmAveCharWidth

Важно понимать, что размеры системного шрифта зависят от разрешающей способности дисплея, на котором работает Windows. Система Windows обеспечивает независимый от оборудования графический интерфейс, но, тем не менее, вам необходимо помочь ей. Не пишите программы для Windows, опирающиеся на конкретные размеры символов. Не задавайте никаких фиксированных значений. Используйте функцию GetTextMetrics для получения этой информации.

    1. Метрики в Win32. Назначение, основные характеристики. Функции работы с метриками.

    1. Функции рисования основных графических объектов.

Windows для рисования линии использует перо, выбранное в контексте устройства в данный момент. Перо определяет цвет линии, ширину и ее стиль, который может быть сплошным, точечным или пунктирным. Перо, устанавливаемое в контексте устройства по умолчанию, называется BLACK_PEN. В программах для Windows обычно для ссылки на перо используется описатель. Заголовочный файл Windows содержит определение типа HPEN, описатель пера. Можно определить переменную HPEN hPen. Чтобы получить описатель одного из стандартных перьев, нужно вызвать функцию: hPen = GetStockObject (WHITE_PEN). Чтобы сделать это перо в контексте устройства текущим пером, нужно вызвать функцию: SelectObject (hdc, hPen). После этого вызова все линии, будут использовать WHITE_PEN до тех пор, пока не будет выбрано другое перо в контекст устройства или пока не освободится контекст устройства. Чтобы создать свое перо, нужно создать "логическое перо", используя функции CreatePen или CreatePenIndirect. Эти функции возвращают описатель логического пера. Потом выбрать перо в контекст устройства путем вызова SelectObject. Затем можно рисовать линии, используя это новое перо. Только одно перо может быть одновременно выбрано в контексте устройства. После освобождения контекста устройства, можно удалить созданное перо, используя DeleteObject. Логическое перо — объект GDI, оно создается и используется, но не принадлежит программе. Перо — это один из шести объектов GDI, которые можно создавать. Другие пять — это кисти, битовые образы, регионы, шрифты и палитры. За исключением палитр все эти объекты выбираются в контекст устройства, используя функцию SelectObject. Три правила управляют использованием объектов GDI:

Обязательно удалять все созданные объекты GDI.

Не удалять объекты GDI, пока они выбраны в действительном контексте устройства.

Не удалять стандартные объекты.

Вызов функции CreatePen выглядит так hPen=CreatePen(iPenStyle,iWidth,rgbColor).

Можно также создать перо, определив структуру типа LOGPEN — "логическое перо" и вызвав функцию CreatePenIndirect. Если программа использует несколько различных перьев, этот метод наиболее эффективен. В начале определяется переменная типа LOGPEN. Эта структура имеет три члена: lopnStyle (UINT) — стиль пера, lopnWidth (POINT) — ширина пера в логических единицах измерения, lopnColor (COLORREF) — цвет пера. Затем создается перо, передавая адрес структуры в функцию: hPen = CreatePenIndirect (&logpen);

Можно также получить информацию логического пера для уже существующего пера.

GetObject (hPen, sizeof (LOGPEN), (LPVOID) &logpen);

CreatePen и CreatePenIndirect не требуют описателя контекста устройства. Они создают логические перья, которые никак не связаны с контекстом устройства до тех пор, пока не вызовается SelectObject. При использовании перьев, созданных функцией CreatePen, концы линий и места соединения всегда будут скругленными.

Значительно более эффективным в графических системах является реализация функций рисования отрезков и других сложных графических операций LineTo, Rectangle, Ellipse, RoundRect, Chord и Pie. Пять атрибутов контекста устройства влияют на представление линий, созданных с использованием этих функций: текущая позиция пера, перо, режим фона, цвет фона и режим рисования. Функция LineTo — одна из немногих функций GDI, которые содержат не все размеры отображаемого объекта. Вместо этого LineTo рисует отрезок прямой из точки, называемой текущим положением пера и определенной в контексте устройства, до точки, заданной при вызове функции. Эта точка не включается в отрезок. Текущая позиция пера — это просто начальная точка для некоторых других функций GDI. В контексте устройства текущее положение пера по умолчанию устанавливается в точку (0,0). Для рисования отрезка из точки с координатами (xStart, yStart) в точку с координатами (xEnd, yEnd) нужно сначала использовать функцию MoveToEx для установки текущего положения пера в точку с координатами (xStart, yStart):

MoveToEx (hdc, xStart, yStart, &pt);

LineTo (hdc, xEnd, yEnd);

Функции Rectangle, Ellipse, RoundRect, Chord и Pie также закрашивают ограниченную этими линиями область, используя текущую кисть. Все эти функции строятся с использованием "ограничивающего прямоугольника". Определяются координаты прямоугольника, ограничивающего объект, и Windows рисует объект, используя этот прямоугольник.

Простейшей из этих функций является функция рисования прямоугольника:

Rectangle(hdc,xLeft,yTop,xRight,yBottom), где точка с координатами (xLeft, yTop) — это левый верхний угол прямоугольника, а точка (xRight, yBottom) — правый нижний угол.

Для эллипса Ellipse(hdc,xLeft,yTop,xRight,yBottom);

В функции Arc, Chord и Pie передаются одинаковые параметры:

Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

Pie (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

Кисти и битовые образы — объекты GDI, поэтому нужно удалить все созданные объекты, до того, как программа завершится. Когда создается кисть на базе битового образа, Windows делает копию данных битового образа для использования при рисовании кистью. Можно удалить битовый образ сразу же после вызова функций CreatePatternBrush или CreateBrushIndirect без какого-либо влияния на кисть.

hBrush = CreatePatternBrush (hBitmap);

SelectObject (hdc, hBrush);

Rectangle (hdc, xLeft, yTop, xRight, yBottom);

DeleteObject (hBrush);

DeleteObject (hBitmap);

Можно изменить цвет фона, который Windows будет использовать для закрашивания пустот, вызвав: SetBkColor (hdc, rgbColor). Можно определить текущий цвет фона, выбранный в контексте устройства, вызвав функцию GetBkColor.

Windows рисует контур фигуры, используя текущее перо, выбранное в контексте устройства. Текущий режим фона, цвет фона и режим рисования — все используются при рисовании этого контура, как будто Windows рисует линию. Фигура закрашивается текущей кистью, выбранной в контексте устройства. Можно выбрать одну из стандартных кистей в контекст устройства точно также как и стандартное перо.

Windows содержит четыре функции, позволяющие создавать логические кисти. Выбор кисти в контекст устройства осуществляется функцией SelectObject. Так же как и логические перья, логические кисти — тоже объекты GDI. Нельзя удалять кисть до тех пор, пока она выбрана в контексте устройства.

hBrush = CreateSolidBrush (rgbColor);

Можно также создавать свои собственные кисти, основанные на битовых шаблонах, используя функцию: hBrush = CreatePatternBrush (hBitmap);

Получив описатель логической кисти, можно выбрать ее в контекст устройства, используя:

SelectObject (hdc, hBrush);

Удалить созданную кисть с помощью функции: DeleteObject (hBrush);

Если нужна информация о кисти, можно вызвать:

GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush);

    1. Объекты в Win32. Классификация объектов. Функции работы с объектами Win32.

    1. Ресурсы Windows. Способы задания ресурсов Windows-приложения и их использования.

Ресурсы бывают системные и определяемые пользователем.

К стандартным ресурсам относятся:

  • Таблица акселераторов, т.е перечисляются комбинаиции клавиш и команды, которые должны быть посланы

  • Значок (иконка) или битовый образ. Битовые образы хранятся в файлах с расширением .BMP. В файле описания ресурсов ссылка на файл значка выглядит примерно так:

myicon ICON iconfile.ico, где ICONFILE.ICO — имя файла значка. В этой инструкции значку присваивается имя «myicon». В программе на С для получения описателя значка используется функция LoadIcon. В функции LoadIcon имеется два параметра. Первым является описатель экземпляра программы, который в WinMain обычно называется hInstance. Этот описатель требуется для Windows, чтобы определить, в каком файле с расширением .EXE содержится ресурс значка. Вторым параметром является имя значка из описания ресурсов, заданное в виде указателя на оканчивающуюся нулем строку. Возвращаемым значением функции LoadIcon является значение типа HICON, которое определяется в WINDOWS.H.

Вместо имени вы также можете использовать число. Это число называется идентификатором (ID) значка.

125 ICON iconfile.ico

hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (125));

MAKEINTRESOURCE является макросом, определенным в заголовочных файлах Windows, который преобразует число в указатель. Так Windows узнает, что второй параметр функции LoadIcon является числом, а не указателем на символьную строку. IDI_APPLICATION также определяется в заголовочных файлах Windows с использованием макроса MAKEINTRESOURCE: #define IDI_APPLICATION MAKEINTRESOURCE (32512)

Хотя для обозначения программ Windows использует значки несколькими способами, во множестве программ для Windows значок задается только при определении класса окна:

wndclass.hIcon = LoadIcon(hInstance, “MyIcon”);

wndclass.hIconSm = LoadIcon(hInstance, “MySmIcon”);

  • Диалоговое окно

  • Расширенный метафайл

  • Шрифт

  • Курсор. Инструкции для задания курсора в файле описания ресурсов и для получения описателя курсора в программе очень похожи на инструкции для значков:

mycursor CURSOR cursfile.cur

hCursor = LoadCursor (hInstance, «mycursor»);

Использование идентификаторов и MAKEINTRESOURCE также работают и для курсоров. В заголовочные файлы Windows включается определение typedef HCURSOR, которое можно использовать для хранения описателя курсора. Вы можете использовать описатель курсора, полученный при вызове функции LoadCursor, при задании поля hCursor структуры класса окна:

wndclass.hCursor = LoadCursor (hInstance, “mycursor”);

  • Растровое изображенеие (bitmap) Битовые образы используются в двух главных целях. Первая — рисование на экране картинок. Вторая цель использования битовых образов — создание кистей.

  • Меню, при описании перечисляются элементы меню и команды, которые должны быть вызваны при обращении к определенному элементу меню

  • Строковые таблицы. Набор строк (у каждой свой ID, свой язык написания), которые хранятся в формате Unicode, каждому символу отводится 2 байта. Файл представлен как набор сообщений, для каждого указано, чем оно послано и его перевод.

  • Информация о версии.

  • Таблица сообщений.

Ресурсы являются данными и они хранятся в .EXE файле программы. К ресурсам нет непосредственного доступа через переменные, определенные в исходном тексте программы. Они должны быть явно загружены из файла с расширением .EXE в память. Когда Windows загружает в память код и данные программы для ее выполнения, она обычно оставляет ресурсы на диске. Только тогда, когда Windows нужен конкретный ресурс, она загружает его в память. При создании программы ресурсы определяются в файле описания ресурсов, который представляет собой файл с расширением .RC. С помощью компилятора ресурсов файл описания ресурсов компилируется и становится бинарным файлом с расширением .RES, который присоединяется либо к подключаемому модулю, либо к библиотеке. В описание ресурсов можно добавить заголовочный файл.

Ресурсы, определяемые пользователем удобны для включения самых разнообразных данных в ваш файл с расширением .EXE и получения доступа в программе к этим данным. Можно добавлять свои ресурсы при помощи: #ifdef, #define, #include.

helptext TEXT proghelp.txt

hResource = LoadResource (hInstance,

FindResource (hInstance, "TEXT", "helptext")) ;

Когда нужно получить доступ к тексту:

pHelpText = LockResource (hResource);

Освободить оперативную память:

FreeResource (hResource);

    1. Диалоговые окна. Назначение, правила описания и использования.

Наиболее часто окна диалога или диалоговые окна используются для получения от пользователя дополнительной информации сверх той, которую может обеспечить меню. Окно диалога обычно имеет вид всплывающего окна с разнообразными дочерними окнами элементов управления внутри. Размер и расположение этих дочерних окон задается в шаблоне окна диалога в файле описания ресурсов программы. Microsoft Windows обеспечивает возможность создания всплывающих окон диалога и дочерних окон элементов управления в нем, и возможность обработки оконной процедурой сообщений окна диалога. Тот код внутри Windows, который дает возможность все это сделать, иногда называют менеджером окна диалога.

Многие сообщения, которые обрабатываются оконной процедурой окна диалога внутри Windows, также передаются и в вашу собственную программу в функцию, называемую процедурой окна диалога. Эта функция похожа на обычную оконную процедуру, но она имеет некоторые важные особенности. Как правило, внутри процедуры диалога не реализуется слишком много функций.

Добавление в программу окна диалога требует внесения изменений в несколько файлов: шаблон окна диалога помещается в файл описания ресурсов, процедура окна диалога – в файл с исходными кодами программы, а идентификаторы, которые используются в окне диалога, часто вносятся в заголовочный файл программы.

Первой задачей, которую нужно решить для добавления в программу окна диалога, является создание шаблона окна диалога. Этот шаблон может быть помещен прямо в файл описания ресурсов, или он может быть создан в отдельном файле, для которого по договоренности используется расширение .DLG. При создании для шаблона отдельного файла, в файл описания ресурсов включается строка:

rcinclude filename.dlg

Диалоговая процедура или процедура диалога программы обрабатывает сообщения, получаемые окном диалога. Хотя она очень сильно напоминает оконную процедуру, это не настоящая оконная процедура. Оконная процедура окна диалога находится в Windows. Эта оконная процедура вызывает вашу диалоговую процедуру, передавая ей многие из сообщений, которые получает сама.

  • Оконная процедура возвращает значение типа LRESULT; а процедура диалогового окна — значение типа BOOL (определяемое в заголовочных файлах Windows как int).

  • Если оконная процедура не обрабатывает какое-то сообщение, она вызывает DefWindowProc; процедура диалога, если она не обрабатывает сообщение, возвращает FALSE (0), а если обрабатывает, то TRUE (ненулевое значение).

  • Процедура диалога не обрабатывает сообщения WM_PAINT и WM_DESTROY. Процедура диалога не получит сообщения WM_CREATE; вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG.

Сообщение WM_INITDIALOG является первым сообщением, которое получает процедура диалога. Это сообщение посылается только процедурам диалога. Если процедура диалога возвращает TRUE, то Windows помещает фокус ввода на первое дочернее окно элемента управления, которое имеет стиль WS_TABSTOP. С другой стороны, при обработке сообщения WM_INITDIALOG процедура диалога может использовать функцию SetFocus для того, чтобы установить фокус на одно из дочерних окон управления окна диалога, и тогда она должна вернуть значение FALSE.

Единственным оставшимся сообщением, которое обрабатывает процедура окна диалога, является WM_COMMAND. Это то сообщение, которое элемент управления кнопка посылает своему родительскому окну тогда, когда либо на ней производится щелчок мышью, либо нажата клавиша <Spacebar> (пробел) и кнопка имеет фокус ввода. Идентификатор дочернего окна элемента управления (который в шаблоне окна диалога равен IDOK) находится в младшем слове параметра wParam. Для этого сообщения процедура диалога вызывает функцию EndDialog, которая сообщает Windows о необходимости закрытия окна диалога. Для всех остальных сообщений процедура диалога возвращает FALSE, сообщая оконной процедуре окна диалога внутри Windows, что процедура диалога программы не обрабатывает сообщение.

Программа обрабатывает сообщения WM_COMMAND и вызывает функцию DialogBox :

DialogBox(hInstance, "AboutBox", hwnd, AboutDlgProc);

Функция DialogBox, которая вызывается для вывода на экран окна диалога, не возвращает управление вWndProcдо тех пор, пока окно диалога не будет закрыто. Возвращаемым значением функцииDialogBoxявляется второй параметр функцииEndDialog, которая вызывается в процедуре диалога.

Даже при выводе на экран окна диалога, WndProcможет продолжать получать сообщения

Стиль окна диалога задается в строке STYLE шаблона окна диалога

При наличии строки заголовка следом за инструкцией STYLE в шаблоне окна диалога можно задать текст заголовка с помощью инструкции CAPTION:

CAPTION "Dialog Box Caption"

Когда вызывается функция DialogBox с указанием имени шаблона окна диалога, Windows уже имеет почти все необходимое для создания всплывающего окна с помощью обычной функции CreateWindow. Windows получает координаты и размеры окна, стиль окна, заголовок и меню из шаблона окна диалога. Описатель экземпляра и описатель родительского окна Windows получает из параметров функции DialogBox. Единственной недостающей частью информации является класс окна (если он не задан в шаблоне окна диалога). Для окон диалога Windows регистрирует особый класс окна. Оконная процедура для такого класса окна имеет доступ к указателю на процедуру диалога приложения, таким образом Windows может информировать программу о сообщениях, получаемых этим всплывающим окном.

    1. Элементы управления. Способы создания и использования.

Можно создавать свои собственные дочерние окна управления, но есть также возможность использовать преимущества нескольких уже определенных классов окна (и оконных процедур), с помощью которых программа может создавать стандартные дочерние окна управления. Такие дочерние окна имеют вид кнопок (buttons), флажков (check boxes), окон редактирования (edit boxes), списков (list boxes), комбинированных списков (combo boxes), строк текста (text strings) и полос прокрутки (scroll bars).

В компиляторе файла описания ресурсов определяется обобщенная форма инструкции окна управления: CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight

Эта инструкция, где можно задать класс окна и полностью определить стиль окна, дает возможность создать любой тип дочернего окна управления. Если инструкция CONTROL используется в шаблоне окна диалога, нет необходимости включать в нее стили WS_CHILD и WS_VISIBLE. Windows включает их в стиль окна при создании дочерних окон. Инструкция CONTROL преобразуется в вызов функции CreateWindow, которая выглядит следующим образом:

CreateWindow ("button", "OK", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,

10 * cxChar / 4, 20 * cyChar / 8, 32 * cxChar / 4,14 * cyChar / 8, hDlg, IDOK, hInstance, NULL) ;

где cxChar и cyChar — это ширина и высота символа системного шрифта в пикселях. Параметр hDlg является возвращаемым значением функции CreateWindow, которая создает окно диалога. Параметр hInstance получен при первом вызове функции DialogBox. Для описания элементов управления, создаваемых пользователем создается функция BOOL DialogProc (параметры сходные с оконной процедурой). Различия оконной процедуры и DialogProc: возвращаемое значение lResult и Bool, если оконная процедура не может обработать сообщение, то вызывает DefWindowProc, а DialogProc возвращает True/False, диалоговая функция не обрабатывает сообщения WM_DESTROY, не получает WM_CREATE, вместо него -WM_INITDIALOG.

В результате создается "дочернее окно управления". Дочернее окно обрабатывает сообщения мыши и клавиатуры и извещает родительское окно о том, что состояние дочернего окна изменилось. Оно инкапсулирует особые действия, связанные с графическим представлением окна на экране, реакцией на пользовательский ввод, и извещения другого окна при вводе важной информации, через сообщение WM_COMMAND они уведомляют родительское окно. Дочерние окна управления наиболее часто используются в окнах диалога. Положение и размер дочерних окон управления определяются в шаблоне окон диалога, который хранится в описании ресурсов программы.

Все элементы управления делятся на группы. Те элементы, которые имеют атрибут WS_TABSTOP, могут перебираться с помощью клавиши ‘tab’.

Окно группы (group boxes) — стиль BS_GROUPBOX — является исключением в классе кнопок. Оно не обрабатывает ни сообщения от клавиатуры, ни сообщения от мыши, оно не посылает своему родительскому окну сообщений WM_COMMAND. Окно группы представляет собой прямоугольную рамку с текстом вверху. Окна групп часто используются для того, чтобы в них размещать другие кнопки управления. Окна группы используются для упрощения переключения с одного элемента на другой, а также для осуществления выбора для RadioButton.

GetDlgItem получает описатель окна управления.

GetDlgCtrlID получает идентификатор окна управления.

TheGetNextDlgTabItemfunctionполучает описатель первого окна управления, имеющего стильWS_TABSTOP.

Есть также элементы общего назначения и использования: commoncontrols,toolbar,statusbar,treeview,progressbar. Об элементе управления нужно знать: как он создается (нужно ли описание в файле ресурсов), тип, управляющие оконные сообщения (они позволяют инициализировать информацию -init, изменять состояние -change, получать инфлрмацию -get), уведомляющие оконные сообщенияWM_NOTIFY.

    1. Процессы и потоки в Win32. Приоритеты. Планирование процессорного времени. Функции работы с процессами и потоками.

Процесс обычно определяют как экземпляр выполняемой программы, и он состоит из двух компонентов:

  • объекта ядра, через который операционная система управляет процессом. Там же хранится статистическая информация о процессе;

  • адресного пространства, в котором содержится код и данные всех EXE- и DLL модулей. Именно в нем находятся области памяти, динамически распределяемой для стеков потоков и других нужд.

Процессы инертны. Чтобы процесс что-нибудь выполнил, в нем нужно создать поток. Именно потоки отвечаю за исполнение кода, содержащегося в адресном пространстве процесса В принципе, один процесс может владеть несколькими потоками, и тогда они "одновременно" исполняют код в адресном пространстве процесса.

Для этого каждый поток должен располагать собственным набором регистров процессора и собственным стеком. В каждом процессе есть минимум один поток. Если бы у процесса не было ни одного потока, ему нечего было бы делать на этом свете, и система автоматически уничтожила бы его вместе с выделенным ему адресным пространством.

Чтобы все эти потоки работали, операционная система отводит каждому из них определенное процессорное время. Выделяя потокам отрезки времени (называемые квантами) по принципу карусели, она создает тем самым иллюзию одновременного выполнения потоков. Рис 4-1 иллюстрирует распределение процессорного времени между потоками на машине с одним процессором. Если в машине установлено более одного процессора, алгоритм работы операционной системы значительно усложняется (в этом случае система стремится сбалансировать нагрузку между процессорами).

Поток (thread) определяет последовательность исполнения кода в процессе. При инициализации процесса система всегда создает первичный поток. Начинаясь со стартового кода из библиотеки С/С++, который в свою очередь вызывает входную функцию (WinMain, wWinMain, mainилиwmain) из Вашей программы, он живет до того момента, когда входная функция возвращает управление стартовому коду и тот вызывает функциюExitProcess. Большинство приложений обходится единственным, первичным потоком. Однако процессы могут создавать дополнительные потоки, что позволяет им эффективнее выполнять свою работу.

Во всех Windows-приложениях должна быть входная функция за реализацию которой отвечаете Вы. Существует четыре такие функции:

int WINAPI WinMain( HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow);

int WINAPT wWinMain( HINSTANCE hinstExe, HINSTANCE, PWSTR pszCmdLine, int nCmdShow);

int __cdecl main( int argc, char *argv[], char *envp[]);

int _cdecl wmain( int argc, wchar_t *argv[], wchar_t *envp[]);

Нужную стартовую функцию в библиотеке С/С++ выбирает компоновщик при сборке исполняемого файла.

Все стартовые функции из библиотеки С/С++ делают практически одно и то же. Разница лишь в том, какие строки они обрабатывают (в ANSI или Unicode) и какую входную функцию вызывают после инициализации библиотеки. Кстати, с Visual C++ поставляется исходный код этой библиотеки, и стартовые функции находятся в файле CRt0.c. А теперь рассмотрим, какие операции они выполняют:

  • считывают указатель на полную командную строку нового процесса;

  • считывают указатель на переменные окружения нового процесса;

  • инициализируют глобальные переменные из библиотеки С/С++, доступ к которым из Вашего кода обеспечивается включением файла StdLib.h. Список этих переменных приведен в таблице 4-1;

  • инициализируют кучу (динамически распределяемую область памяти), используемую С-функциями выделения памяти (т.е. mallocиcalloc) и другими процедурами низкоуровневого ввода-вывода;

  • вызывают конструкторы всех глобальных и статических объектов С++-классов.

Когда Ваша входняя функция возвращает управление, стартовая обращается к функции exitбиблиотеки С/С++ и передает ей значениеnMainRetVal. Функцияexitвыполняет следующие операции:

  • вызывает все функции, зарегистрированные вызовами функции _onexit;

  • вызывает деструкторы всех глобальных и статических объектов С++-классов;

  • вызывает Windows-функцию ExifProcess, передавая ей значениеnMainRetVal. Это заставляет операционную систему уничтожить Ваш процесс и установить код его завершения.

Каждый поток начинает выполнение с некоей входной функции. В первичном потоке таковой является main, wmain, WinMainилиwWinMain. Если Вы хотите создать вторичный поток, в нем тоже должна быть входная функция, которая выглядит примерно так:

DWORD WINAPI ThreadFunc(PVOID pvPararn) { DWORD rtwResult = 0;

return(dwResult); }

Функция потока может выполнять любые задачи.