
- •Оглавление
- •1 Простейшее Win32 приложение
- •2 Функция WinMain
- •3 Оконный класс
- •4 Стили класса, стили окна
- •5 Создание экземпляра оконного класса
- •6 Динамические изменения свойств оконного класса
- •7 Обработка сообщений
- •8 Программирование клавиатуры
- •9 Коды oem, ansii, asci, виртуальные коды клавиш
- •10 Символьные сообщения
- •11 Обработка сообщений от мыши
- •12 Программирование таймера
- •13 Диалоговые окна
- •14 Структура шаблона диалога
- •14(А) Ресурсы диалога
- •15 Функции создания диалога
- •16 Взаимодействие между элементами управления
- •17 Сообщения, SendMessage, SendDlgItemMessage
- •18 Обработка сообщений от элементов диалога
- •19 Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 api, c.148)
- •20 Элемент ProgressBar (Румянцев - Азбука программирования в Win32 api, c.156)
- •21 Bios (общие сведения)
- •22 Файлы (общие сведения)
- •23 Создание файла (Win32 api)
- •24 Операции с файлом (Win32 api)
- •25 Организация файлов
- •26 Файловые системы (общие сведения)
- •Создание файла.
- •Удаление файла.
- •28 Структура логического диска под fat12 (wfat)
- •29 Каталоги в fat12
- •30 Алгоритм определения расположения файлов на диске
- •31 Ф.С. Fat32 (отличительные особенности)
- •32 Изменение элементов системных объектов при выполнении copy
- •33 Ntfs (общие сведения)
- •34 Запись файла в mft
- •35 Метафайлы
- •36 Атрибуты записи файла
- •37 Изменение системных данных при выполнении copy
- •38 Изменение системных данных при выполнении del
- •39 Изменение системных данных при выполнении move
- •40 Процессы. Потоки. Общие сведения
- •41 Модель процесса
- •42 Контекст процесса
- •43 Дескриптор процесса
- •44 Создание процесса (общие сведения)
- •45 Окончание процесса (общие сведения)
- •46 Состояния процесса
- •47 Уровни планирования процессов
- •48 Диспетчеризация процессов
- •49 Класс приоритета процесса
- •50 Создание процесса (Win32 api)
- •51 Win32 Api. Управление процессами
- •52 Win32 Api. Окончание процесса
- •53 Среда процесса
- •54 Командная строка процесса
- •55 Наследование дочерними процессами ресурсов родителя
- •56 Список процессов
- •57 Время выполнения процесса
55 Наследование дочерними процессами ресурсов родителя
Дочерний процесс может наследовать несколько свойств и ресурсы от своего родительского процесса. Вы можете также и не допустить дочерний процесс к наследованию свойств от его родителя. Ниже перечисляется то, что может быть унаследовано:
Открытые дескрипторы, возвращенные функцией CreateFile. Это включает в себя дескрипторы к файлам, буферам консольного ввода, консольным экранным буферам, именованным каналам, последовательным устройствам связи и почтовым ящикам в ядре системы.
Открытые дескрипторы процесса, потока, мьютекса, события, семафора, именованного канала, анонимного канала и отображаемых в памяти объектов. Они возвращаются функциями CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe и CreateFileMapping, соответственно.
Переменные окружения.
Текущий каталог.
Консоль, если процесс не отсоединен или создается новая консоль. Дочерний процесс консоли также наследует стандартные дескрипторы родителя, также как и доступ к входному буферу и активному экранному буферу.
Дочерний процесс не наследует нижеследующее:
Класс приоритета.
Дескрипторы, возвращенные функциями LocalAlloc, GlobalAlloc, HeapCreate, и HeapAlloc.
Псевдодескрипторы такие же, как дескрипторы, возвращенные функцией GetCurrentProcess или GetCurrentThread. Эти дескрипторы допустимы только для вызывающего процесса.
Дескрипторы модуля динамически подключаемой библиотеки (DLL), возвращенные функцией LoadLibrary.
Дескрипторы GDI или USER, типа HBITMAP или HMENU.
Наследование дескрипторов
Дочерний процесс, чтобы наследовать некоторые из дескрипторов своего родителя, но не наследует другие. Чтобы заставить дескриптор быть унаследованным, Вы должны сделать две вещи:
Определить, что дескриптор должен быть унаследован, когда Вы создаете, открываете или дублируйте дескриптор. Функции создания обычно используют для этой цели член bInheritHandle структуры SECURITY_ATTRIBUTES. Функция DuplicateHandle использует параметр bInheritHandle.
Определить, что наследуемые дескрипторы должны быть унаследованы тогда, когда Вы вызываете функцию CreateProcess с параметром bInheritHandles установленным в значение ИСТИНА (TRUE). Дополнительно, чтобы наследовать стандартный ввод, стандартный вывод данных и обработку стандартной ошибки, член dwFlags структуры STARTUPINFO должен включить в себя флажок STARTF_USERSTDHANDLES.
Унаследованный дескриптор относится к тому же самому объекту в дочернем процессе, поскольку это происходит в родительском процессе. К тому же он имеет то же самое значение и привилегии доступа. Поэтому, когда один процесс изменяет состояние объекта, изменение воздействует на оба процесса. Чтобы использовать дескриптор, дочерний процесс должен извлечь значение дескриптора и "знать" объект, к которому он обращается. Обычно, родительский процесс сообщает эту информацию дочернему процессу через его командную строку, блок конфигурации, или некоторую форму межпроцессорного взаимодействия.
Функция DuplicateHandle является полезной тогда, если процесс имеет наследуемый открытый дескриптор, а Вы не желаете, чтобы он был унаследован дочерним процессом. В этом случае используйте функцию DuplicateHandle, чтобы открыть дубликат дескриптора, который не может быть унаследован, а затем используйте функцию CloseHandle, чтобы закрыть наследуемый дескриптор. Вы можете также использовать функцию DuplicateHandle, чтобы открыть наследуемый дубликат дескриптора, который не может быть унаследован.
Наследование текущего каталога
Функция GetCurrentDirectory получает данные о текущем каталоге вызывающего процесса. Дочерний процесс наследует текущий каталог своего родительского процесса по умолчанию. Однако CreateProcess дает возможность родительскому процессу установить другой текущий каталог для дочернего процесса. Чтобы изменить текущий каталог вызывающего процесса, используйте функцию SetCurrentDirectory.
Наследование переменных окружения
Дочерний процесс наследует переменные окружения своего родительского процесса по умолчанию. Однако CreateProcess дает возможность родительскому процессу определить другой блок переменных окружения.