Джонсон Харт - Системное программирование в среде Windows
- Название:Системное программирование в среде Windows
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2005
- Город:Москва • Санкт-Петербург • Киев
- ISBN:5-8459-0879-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джонсон Харт - Системное программирование в среде Windows краткое содержание
Эта книга посвящена вопросам разработки приложений с использованием интерфейса прикладного программирования операционных систем компании Microsoft (Windows 9х, Windows XP, Windows 2000 и Windows Server 2003). Основное внимание уделяется базовым системным службам, включая управление файловой системой, процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Рассматривается методика переноса приложений, написанных в среде Win32, в среду Win64. Подробно описываются все аспекты системы безопасности Windows и ее практического применения. Изобилие реальных примеров, доступных также и на Web-сайте книги, существенно упрощает усвоение материала.
Книга ориентирована на разработчиков и программистов, как высокой квалификации, так и начинающих, а также будет полезна для студентов соответствующих специальностей.
Системное программирование в среде Windows - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Microsoft выбрала модель LLP64 (целые числа типа long и 64-битовые указатели), на которую обычно ссылаются просто как на модель Р64. В частности, существуют следующие определения типов данных, применимые как к данным со знаком, так и к данным без знака:
• char — 8 бит, и wchar — 16 бит.
• short — 16 бит.
• int — 32 бита.
• long int — также 32 бита.
• Размер указателя любого типа, например PVOID, составляет 64 бита.
Для тех случаев, когда требуются данные строго определенного размера, предусмотрены дополнительные типы данных. Так, компилятор Microsoft различает следующие типы данных: _int16, _int32 и _int64.
Типы данных
Приведенные в этой главе таблицы взяты непосредственно из оперативной справочной системы и представляют единую модель данных Windows (Windows Uniform Data Model). Определения типов можно найти в заголовочном файле BASETSD.H, входящем в состав интегрированной среды разработки приложений Microsoft Visual Studio .NET (версия 7.0) и версию 6.0 этой системы.
Типы данных фиксированной точности
Обозначения типов данных фиксированной точности получаются из обычных обозначений типов данных Win32, таких как DWORD или LONG, добавлением суффикса размера, как показано в табл. 16.1.
Таблица 16.1. Типы данных фиксированной точности
Тип данных | Описание |
---|---|
DWORD32 | 32-битовое целое без знака |
DWORD64 | 64-битовое целое без знака |
INT32 | 32-битовое целое со знаком |
INT64 | 64-битовое целое со знаком |
LONG32 | 32-битовое целое со знаком |
LONG64 | 64-битовое целое со знаком |
UINT32 | Целое типа INT32 без знака |
UINT64 | Целое типа INT64 без знака |
ULONG32 | Целое типа LONG32 без знака |
ULONG64 | Целое типа LONG64 без знака |
Типы данных, соответствующие точности указателей
Процитируем выдержку из статьи Microsoft под названием "The New Data Types" (доступна на Web-сайте компании Microsoft): "Точность этих типов данных отражает изменение точности указателей (то есть, они становятся 32-битовыми в коде Win32 и 64-битовыми в коде Win64). Поэтому приведение указателей к одному из этих типов при выполнении арифметических операций с указателями является безопасным; при 64-битовой точности указателей размер данных этого типа будет составлять 64 бита. Также и типы данных, соответствующие счетчикам, отражают максимальный размер данных, на которые может ссылаться указатель." Таким образом, эти типы данных обеспечивают автоматическое изменение размеров целочисленных типов данных в зависимости от изменения размеров указателей, в связи с чем их иногда называют полиморфными (polymorphic data types) или платформо-масштабируемыми (platform scaled data types) типами данных. Типы данных, соответствующие точности указателей, перечислены в табл. 16.2, взятой из той же статьи.
Наиболее важным из них является тип данных SIZE_T, который уже использовался нами при описании размеров блоков памяти в главе 5.
Наконец, заметьте, что в Win64 размер данных типа HANDLE составляет 64 бита.
Таблица 16.2. Типы данных, соответствующие точности указателей
Тип данных | Описание |
---|---|
DWORD_PTR | Длинное целое без знака, соответствующее точности указателей. |
HALF_PTR | Половина размера указателя. Используется в структурах, содержащих указатель и два поля небольшого размера. |
INT_PTR | Целое со знаком, соответствующее точности указателей. |
LONG_PTR | Длинное целое со знаком, соответствующее точности указателей. |
SIZE_T | Максимальное количество байтов, на которые может ссылаться указатель. Используется для счетчиков, которые должны охватывать весь диапазон возможных значений указателей. |
SSIZE_T | Тип SIZE_T со знаком. |
UHALF_PTR | Тип HALF_PTR без знака. |
UINT_PTR | Тип INT_PTR без знака. |
ULONG_PTR | Тип LONG_PTR без знака. |
Пример: использование указательных типов данных
Аргументом потока, передаваемым функции потока при вызове CreateThread и _beginthreadex (см. главу 7), является указатель типа PVOID. Иногда программист может захотеть передать функции потока только целочисленное значение, указывающее, например, номер потока или индекс данных в глобальной таблице. Тогда функцию потока, интерпретирующую параметр как целое без знака, можно было бы написать следующим образом:
DWORD WINAPI MyThreadFunc(PVOID Index_PTR) {
DWORD_PTR Index;
…
Index = (DWORD_PTR)Index_PTR;
…
}
Аналогичным образом, зная, что фактический аргумент является целым числом, вы могли бы записать соответствующий участок кода основного потока следующим образом:
…
DWORD_PTR Ix;
…
for (Ix = 0; Ix < NumThreads; Ix++) {
hTh[Ix] = _beginthreadex(NULL, 0, MyThreadFunc, (PVOID)Ix, 0, NULL);
…
}
Заметьте, что в уже существующий код вам придется внести необходимые изменения. Об этом говорится далее в разделе "Перенос существующего кода".
Предостережение
Пока, по крайней мере, в случае первоначальных вариантов реализации, не следует рассчитывать на получение доступа ко всему виртуальному адресному пространству. Размер виртуальных адресных пространств может ограничиваться такими, например, значениями, как 512 Гбайт, что соответствует ограничению данных 39 битами. Можно надеяться, что со временем, по мере эволюции процессоров и систем, указанный верхний предел увеличится.
Различия между Windows и UNIX
В Windows и UNIX выбраны различные стратегии. Большинство поставщиков UNIX-систем реализуют модель LP64, в которой размер как длинного целочисленного, так и указательного типов данных составляет 64 бита. Такую модель иногда называют моделью "I32, LP64", чтобы подчеркнуть тот факт, что размер данных типа int по-прежнему составляет 32 бита. Таким образом, различие между обеими системами в рассматриваемом нами смысле сводится к различию в размерах целых чисел типа long. К тому же, типы данных, перечисленные в таблицах 16.1 и 16.2, приняты только в Windows.
Для каждой из двух моделей имеются разумные обоснования, и в белых страницах "Aspen", фигурирующих в списке дополнительной литературы к этой главе, приводятся аргументы, объясняющие выбор, сделанный в UNIX. И все же, было бы гораздо удобнее, если бы в обеих ОС действовали одни и те же соглашения.
Перенос имеющегося программного кода
Единая модель данных Windows призвана минимизировать объем возможных изменений исходного кода, но полностью избежать необходимости внесения изменений невозможно. Например, такие функции, как HeapCreate и HeapAlloc (глава 5), которые имеют дело непосредственно с распределением памяти и размерами блоков памяти, должны использовать либо 32-битовое, либо 64-битовое поле, в зависимости от модели. Точно так же, следует всегда тщательно проверять код, чтобы выяснить, не используются ли в нем скрытые допущения относительно размеров полей и указателей.
Читать дальшеИнтервал:
Закладка: