![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Конфігураційні файли 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 рядка запуску програм виглядають так:
Аналізуючи такі рядки можна зрозуміти, які файли запускаються при старті комп'ютера. У файлі system.ini є рівно один рядок, через яку найчастіше запускаються віруси, розташована в секції [boot]:
У всіх версіях 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;
Питання для самоконтролю:
Лабораторная работа №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
Принципы построения оконных приложений
Структура окна 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 Константы Стили окна
В программе стиль главного окна программы задается следующим образом: STYLE EQU CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
|