Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Конфігураційні файли win.ini і system.ini






Набудувати автозапуск програм можна і в системних файлах Windows - system.ini і win.ini. Ці файли використовуються (переважно, використовувалися) в Windows 3.x, 9x, Me для зберігання системних настройок. У Windows NT, 2000, XP аналогічні настройки перенесені в системний реєстр, але старі конфігураційні файли збережені в цілях забезпечення сумісності із старими ж програмами.

Конфігураційні файли win.ini і system.ini розбиті на секції. Назва кожної секції укладена в квадратні дужки, наприклад, [boot] або [windows].

У файлі win.ini рядка запуску програм виглядають так:

  • Load=< строка запуска>
  • Run=> строка запуска>

Аналізуючи такі рядки можна зрозуміти, які файли запускаються при старті комп'ютера.

У файлі system.ini є рівно один рядок, через яку найчастіше запускаються віруси, розташована в секції [boot]:

  • shell=< имя програмної оболонки Windows>

У всіх версіях Windows стандартною програмною оболонкою є explorer.exe. Якщо в рядку shell= вказане щось відмінне від explorer.exe, це з великою вірогідністю шкідлива програма. Справедливості ради, потрібно відзначити, що існують легальні програми, що є альтернативними програмними оболонками Windows. Такі програми можуть змінювати значення параметра shell у файлі system.ini.

Для створення програми можна використати класи TRegistry й TiniFile.

Частина коду, написаного на Delphi, яка вносить корективи до файлів Системного реєстру

 

procedure TForm1.Button2Click(Sender: TObject);

begin

if OpenDialog1.Execute then

begin

Edit1.Text: =OpenDialog1.FileName;

ini: =TIniFile.Create(OpenDialog1.FileName);

ComboBox1.Clear;

ini.ReadSections(ComboBox1.Items);

ComboBox1.ItemIndex: =0;

ComboBox1Change(Self);

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var reg: TRegistry; key: TStrings; value: string;

i, j: integer;

begin

try

if Edit2.Text = '' then raise

Exception.Create('Вы забыли ввести название ключа реестра! ');

try

reg: =TRegistry.Create;

reg.RootKey: =HKEY_CURRENT_USER;

for i: =0 to ComboBox1.Items.Count-1 do

begin

if reg.OpenKey('\'+Edit2.Text+'\'+ComboBox1.Items[i], true) then

begin

key: =TStringList.Create;

ini.ReadSection(ComboBox1.Items[i], key);

for j: =0 to key.Count-1 do

begin

value: =ini.ReadString(ComboBox1.Items[i], key[j], '');

reg.WriteString(key[j], value);

end;

key.Free;

end;

end;

ShowMessage('Данные были успешно внесены в реестр.');

finally reg.Free; end;

except raise; end;

end;

 

Питання для самоконтролю:

    1. Для чого призначений Системний реєстр?
    2. Які існують гілки в реєстрі, за що відповідає кожна з них?
    3. У яких файлах зберігається Системний реєстр?
    4. Що таке ключ реєстру?
    5. У яких файлах містяться відомості про автозавантаження?
    6. Дії, що проводяться з реєстром?

 

 

Лабораторная работа №3

Разработка стандартных оконных приложений с простейшими элементами управления под Windows

 

Основы программирования в операционной системе Windows

1. Программирование в Windows основывается на использовании функций API (Application Program Interface, интерфейс программного приложения). Их количество достигает двух тысяч. Ваша программ в значительной степени будет состоять из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы будет происходит посредством таких функций.

2. Список функций API и их описание лучше всего брать из файла WIN32.HLP, который поставляется, например с пакетом Borland C++.

3. Главным элементом программы в среде Windows является окно. Для каждого окна определяется своя процедура обработки сообщения.

4. Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна.

5. Операционная система Windows использует линейную адресации памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например ЕВХ.

6. Следствием пункта 5 является то, что мы фактически не ограничены в объеме данных, кода или стека (объеме локальных переменных). Сегменты в тексте программы играют теперь другую роль. Они позволяют задать отдельным фрагментам кода (секциям) определенные свойства: запрет на запись, общий доступ и т.д.

7. ОС Windows является многозадачной средой. Каждая задача имеет свое адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность – любая процедура может быть запущена как самостоятельная задача.

 

Вызов функций API

Для наглядности рассмотрим подробно одну из API-функций – int MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

Данная функция выводит на экран окно с сообщением и кнопкой выхода. Смысл параметров: hWnd – дескриптор окна, в котором будет появляться окно-сообщения, lpText – текст, который будет появляться в окне, l pCaption – текст в заголовке окна, uType – тип окна, в частности можно определить количество кнопок выхода. Все параметры являются 32-х битными целыми числами. По причине, которая будет объяснена позже, к имени функции нам придется добавлять суффикс «А», кроме того, при использовании MASM необходимо также в конце имени добавить @16 (CALL MessageBoxA@16).

Параметры функции следует предварительно, перед вызовом функции, поместить в стек командами PUSH, по правилу «слева направо – снизу вверх».

 

Пример:

Пусть дескриптор окна расположен по адресу HW, строки – по адресам STR1 и STR2, а тип окна сообщения – это константа. Самый простой тип имеет значение 0 и называется MB_OK. Имеем следующее:

MB_OK equ 0

.

.

STR1 DB “Неверный ввод! “, 0

STR2 DB “Сообщение об ошибке.”, 0

HW DWORD?

.

.

PUSH MB_OK

PUSH OFFSET STR1

PUSH OFFSET STR2

PUSH HW

CALL MessageBoxA@16

 

Результат выполнения любой функции – это, как правило, целое число, которое возвращается в регистре EAX.

 

Структура окна

Мы будем рассматривать классическую структуру программы под Windows. В такой программе имеется главное окно, а следовательно, и процедура главного окна. В целом, в коде программы можно выделить следующие разделы:

· Регистрация класса окон;

· Создание главного окна;

· Цикл обработки очереди сообщений;

· Процедура главного окна.

Конечно в программе могут быть и другие разделы, но данные разделы образуют основной скелет программы. Разберем эти разделы по порядку.

 

Регистрация класса окон

Регистрация класса окон осуществляется с помощью функции RegisterClassA, единственным параметром которой является указатель на структуру WNDCLASS, содержащую информацию об окне.

 

Создание окна

На основе зарегистрированного класса с помощью функции CreateWindowExA (или CreateWindowA) можно создать экземпляр окна. Как можно заметить, это весьма напоминает объектную модель программирования.

 

Цикл обработки очереди сообщений

Вот как выглядит этот цикл на языке Си:

 

While (GetMessage (& msg, NULL, 0, 0))

{

// разрешить использование клавиатуры путем трансляции сообщений

// о виртуальных клавишах в сообщении об алфавитно-цифровых

// клавишах

TranslateMessage(& msg);

// вернуть управление Windows и передать сообщение дальне

// Процедура окна

DispatchMessage(& msg);

}

 

Функция GetMessage() «отлавливает» очередное сообщение из ряда сообщений данного приложения и помещает его в структуру MSG.

Что касается функции TranslateMessage, то ее компетенция касается сообщений WM_KEYDOWN и WM_KEYUP, которые транслируются в WM_CHAR и WM_DEDCHAR, а также WM_SYSCHAR и WM_SYSDEADCHAR.

Выход из цикла ожидается только в том случае, если функция GetMessage возвращает 0. Это происходит только при получении сообщения о выходе (WM_QUIT).

 

Процедура главного окна

Вот прототип функции окна на языке С:

LRESULT CALLBACK WindowFunc (HWND hwnd, UINT message,

WPARAM wParam, LPARAM lParam)

hwnd – идентификатор окна;

message – идентификатор сообщения;

wParam и lParam – параметры, уточняющие смысл сообщения (для каждого сообщения могут играть разные роли или не играть никаких). Все четыре параметра имеют тип DWORD.

Скелет на языке ассемблера имеет следующий вид:

WNDPROC PROC

PUSH EBP

MOV EBP, ESP;

PUSH EBX

PUSH ESI

PUSH EDI

PUSH DWORD PTR [EBP+14H];

PUSH DWORD PTR [EBP+10H];

PUSH DWORD PTR [EBP+0CH];

PUSH DWORD PTR [EBP+08H];

CALL DefWindowProcA@16

POP EDI

POP ESI

POP EBX

POP EBP

RET16

WNDPROC ENDP

 

Принципы построения оконных приложений

  1. Свойства конкретного окна задаются при вызове функции CreateWindow определением параметра Style. Константы, определяющие свойства окна, содержатся в специальных файлах, которые подключаются при компиляции. Поскольку свойства фактически определяются значением того или иного бита в константе, комбинация свойств – это просто сумма битовых констант. В отличии от многих рекомендаций для разработчиков все константы здесь определяются непосредственно в программах.
  2. Окно создается на основе зарегистрированного класса. Оно может содержать элементы управления – кнопки, окна редактирования, списки, полосы прокрутки и т.д. Все эти элементы могут создаваться как окна с предопределенными классами (для кнопок BUTTON, для окна редактирования EDIT, для счетчика LISTBOX и т.д.).
  3. Система общается с окном, а следовательно, и с самим приложением посредством посылки сообщений. Эти сообщения должны обрабатываться процедурой окна. Программирование под Windows в значительной степени является программированием обработки таких сообщений. Сообщения генерируются системой также в случаях каких-либо визуальных событий, происходящих с окном или управляющими элементами в нем. К таким событиям относятся перемещение окна или изменение его размеров, нажатие кнопки, выбор элемента в списке, перемещение курсора мыши и т.п. Это понятно, программа должна как-то реагировать на подобные события.
  4. Сообщение имеет код (будем обозначать его в программе VES) и два параметра (WPARAM и LPARAM). Для каждого кода сообщения придумано свое макроимя, хотя это всего лишь целое число. Например, сообщение WM_CREATE приходит один раз, когда создается окно, WM_PAINT посылается окну при его перерисовке, сообщение WM_RBUTTONDOWN генерируется, если щелкнуть правой кнопкой мыши при расположении курсора мыши в области окна и т.д. Параметры сообщения могут не иметь никакого смысла либо играть уточняющую роль. Например, сообщение WM_COMMAND генерируется системой, когда что-то происходит с управляющими элементами окна. В этом случае по значению параметров можно определить, какой это элемент и что с ним произошло (LPARAM – дескриптор элемента, старшее слово WPARAM – событие, младшее слово WPARAM – обычно идентификатор ресурса). Можно сказать, что сообщение WM_COMMAND несет сообщение от элемента окна.
  5. Сообщение может генерироваться не только системой, но и самой программой. Например, можно послать сообщение-команду какому-либо элементу управления (добавить элемент в список, передать строку в окно редактирования и т.п.). Иногда посылка сообщений используется как прием программирования. Например, можно придумать свои сообщений так, чтобы при их посылке программа выполнила те или иные действия. Естественно, это сообщение должно «отлавливаться» либо в процедуре какого-нибудь окна, либо в цикле обработки сообщений. Такой подход очень удобен, поскольку позволяет фактически осуществлять циклические алгоритмы так, чтобы возможные изменения с окном во время исполнения такого цикла сразу проявлялись на экране.

 

Структура окна

WNDCLASS STRUC

CLSSTYPE DD?; стиль окна

CWNDPROC DD?; указатель на процедуру окна

CLSCEXTRA DD?; инф-я о доп. байтах для структуры

CLWNDEXTRA DD?; информация о доп. байтах для окна

CLSHINSTANCE DD?; дескриптор приложения

CLSICON DD?; идентификатор пиктограммы окна

CLSHCURSOR DD?; идентификатор курсора окна

CLBKGROUND DD?; идентификатор кисти окна

CLMENUNAME DD?; имя-идентификатор меню

CLNAM DD?; специфицирует имя класса окон

WNDCLASS ENDS

 

Структура сообщения

MSGSTRUCT STRUC

MSHWND DD?; идент. Окна, получающего сообщение

MSMESSAGE DD?; идентификатор сообщения

MSWPARAM DD?; доп. информация о сообщении

MSLPARAM DD?; доп. информация о сообщении

MSTIME DD?; время посылки сообщения

MSPT DD?; курсор, во время посылки сообщения

MSGSTRUCT ENDS

Константы

Стили окна

    • CS_VREDRAW equ 1
    • CS_HREDRAW equ 2
    • CS_GLOBALCLASS equ 4000H

 

    • WS_TABSTOP equ 10000H
    • WS_SYSMENU equ 80000H
    • WS_VISIBLE equ 10000000H
    • WS_CHILD equ 40000000H
    • WS_BORDER equ 800000H
    • WS_THICKFRAME equ 40000H
    • WS_VSCROLL equ 200000H

 

    • WS_OVERLAPPEDWINDOW equ WS_TABSTOP+WS_SYSMENU

В программе стиль главного окна программы задается следующим образом:

STYLE EQU CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.