close

Вход

Забыли?

вход по аккаунту

?

оси5 (2)

код для вставкиСкачать
Работа в Delphi
Теоретическое введение.
Создание процесса.
Для создания процесса используется функция CreateProcess, имеющая следующий вид:
function CreateProcess lpApplicationName: PChar; lpCommandLine: PChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
Структура TStartupInfo. имеет следующий вид:
TStartupInfo = record
cb: DWORD; lpReserved: Pointer; lpDesktop: Pointer;
lpTitle: Pointer; dwX: DWORD; dwY: DWORD; dwXSize: DWORD; dwYSize: DWORD; dwXCountChars: DWORD; dwYCountChars: DWORD;
dwFillAttribute: DWORD; dwFlags: DWORD;
wShowWindow: Word; cbReserved2: Word; lpReserved2: Byte; hStdInput: THandle; hStdOutput: THandle; hStdError: THandle;
end;
Структура TProcessInformation имеет следующий вид:
TProcessInformation =record
hProcess: THandle; hThread: THandle;
dwProcessId: DWORD; dwThreadId: DWORD;
end;
Структура TProcessInformation содержит выходные данные и заполняется функцией CreateProcess. Если функция CreateProcess успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка - возвращается 0 (false). Тогда информацию об ошибке можно получить, вызвав функцию GetLastError.
Запуск внешней программы функцией WinExec.
Самый простой способ запустить какую-то программу из своего приложения - использовать функцию WinExec. Эта функция может работать в любых версиях Windows и выполнять любые файлы: приложения Windows, MS-DOS, файлы PIF и т.п. Функция WinExec определяется следующим образом:
function WinExec(CmdLine: PChar; CmdShow: integer): integer;
Параметр CmdLine является указателем на строку с нулевым символом в конце, содержащую имя выполняемого файла и, если необходимо, параметры командной строки. Если имя файла указано без пути, то Windows будет искать в каталогах выполняемый файл в следующей последовательности:
1. Каталог, из которого загружено приложение
2. Текущий каталог
3. Системный каталог Windows, возвращаемый функцией GetSystemDirectory.
4. Каталог Windows, возвращаемый функцией GetWindowsDirectory
5. Список каталогов из переменной окружения PATH
Параметр CmdShow определяет форму представления окна запускаемого приложения Windows. Чаще всего используется значение SW_RESTORE, при котором окно запускаемого приложения активизируется и отображается на экране. При успешном выполнении запуска приложения функция WinExec возвращает значение, большее 31. Запуск внешней программы и открытие документа функцией ShellExecute.
Функция ShellExecute может не только выполнять заданное приложение, но и открывать документ и печатать его.
Для использования функции ShellExecute в операторе uses надо добавить модуль ShellAPI. Автоматически Delphi не включает этот модуль в программу.
Функция ShellExecute определена следующим образом:
function ShellExecute(Wnd: HWnd; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): THandle;
При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
Функция ShellExecute автоматически отыскивает приложение, связанное с типом открываемого документа, и запускает его. Но иногда требуется вызвать явным образом приложение, связанное с каким-то документом, например, чтобы передать ему какие-то дополнительные параметры. Помочь в этом может функция FindExecutable, которая возвращает имя и путь приложения, связанного с указанным файлом. Использование этой функции требует включения в оператор uses модуля ShellAPI.
Функция FindExecutable определена следующим образом:
function FindExecutable (FileName, Directory, Buffer: PChar): THandle;
Она позволяет получить имя выполняемого exe- файла, связанного с файлом, указанным параметром FileName.
При успешном завершении функция FindExecutable возвращает значение, большее 32. Если возвращено меньшее значение, это свидетельствует об ошибке. Возможные значения ошибок те же, что и для приведенных ранее функций.
Создание потока.
Для создания потока используется функция CreateThread:
function CreateThread (lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; Функция возвращает дескриптор потока.
Завершение процесса. Процесс завершается, когда один из его потоков вызывает процедуру ExitProcess:
procedure ExitProcess(uExitCode: UINT); uExitCode - в эту переменную заносится код завершения процесса.
Если за вызовом этой процедуры в программе присутствует какой-либо код, он никогда не будет выполнен.
Вызов функции TerminateProcess, также завершает процесс. Данная функция имеет следующий вид:
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; где
hProcess - дескриптор завершаемого процесса
uExitCode - в данной переменной возвращается код завершения процесса.
Если функция TerminateProcess успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка - возвращается 0 (false). Завершение потока. Поток можно завершить принудительно, вызвав процедуру ExitThread:
procedure ExitThread(dwExitCode: DWORD); где в переменную dwExitCode заносится код завершения потока.
Завершить поток можно также вызвав функцию TerminateThread:
function TerminateThread(hThread: THandle; dwExitCode: DWORD): BOOL; где hThread - дескриптор завершаемого потока
dwExitCode - в данной переменной возвращается код завершения потока.
Если функция TerminateThread успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка - возвращается 0 (false).
В отличие от ExitThread, которая завершает поток, вызывающий данную процедуру, функция TerminateThread завершает любой поток, дескриптор которого указан в параметре hThread.
Изменение класса приоритета процесса.
Для изменения класса приоритета процесса используется функция SetPriorityClass:
function SetPriorityClass(hProcess: THandle; dwPriorityClass: DWORD): BOOL;
где hProcess - дескриптор процесса
dwPriorityClass- идентификатор класса приоритета процесса. Если функция SetPriorityClass успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка - возвращается 0 (false).
Получение информации о классе приоритета процесса. Для получения информации о классе приоритета процесса применяется функция GetPriorityClass
function GetPriorityClass(hProcess: THandle): DWORD; где hProcess - дескриптор процесса
Изменение уровня приоритета потока. Для изменения уровня приоритета потока применяется функция SetThreadPriority:
function SetThreadPriority(hThread: THandle; nPriority: Integer): BOOL; где hThread - дескриптор потока
nPriority - идентификатор, показывающий на сколько изменяется уровень приоритета потока относительно класса. Получение информации о приоритете потока. Для получения информации о приоритете потока используется функция GetThreadPriority:
function GetThreadPriority(hThread: THandle): Integer; где hThread - дескриптор потока.
Рабочее задание.
Программа, выполняющая запуск любого процесса и изменяющая приоритет данного процесса.
Текст программы (тексты функций и процедур)
procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.Close;
end;
function Priority(P: DWORD): String;
begin
Case P of
REALTIME_PRIORITY_CLASS: Result := 'Real time';
HIGH_PRIORITY_CLASS: Result := 'High';
NORMAL_PRIORITY_CLASS: Result := 'Normal';
IDLE_PRIORITY_CLASS: Result := 'Idle';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var POperation: array[0..50] of Char;
PFilename: array[0..254] of Char;
P: DWORD;
begin
POperation := 'open'+#0;
PFilename := 'C:\Windows\system32\Calc.exe'+#0;
ShellExecute(Handle,POperation,PFilename,nil,nil,SW_RESTORE);
P := GetPriorityClass(GetCurrentProcess());
Edit1.Text := Priority(P);
end;
procedure TForm1.Button2Click(Sender: TObject);
var P: DWORD;
begin
If ComboBox1.Text = 'Idle' then
P := IDLE_PRIORITY_CLASS;
If ComboBox1.Text = 'Normal' then
P := NORMAL_PRIORITY_CLASS;
If ComboBox1.Text = 'High' then
P := HIGH_PRIORITY_CLASS;
If ComboBox1.Text = 'Real time' then
P := REALTIME_PRIORITY_CLASS;
SetPriorityClass(GetCurrentProcess(),P);
P := GetPriorityClass(GetCurrentProcess());
Edit1.Text := Priority(P);
end;
Экранная форма
Вывод
В ходе выполнения лабораторной работы были изучены методы работы с процессами и потоками.
Работа в Ассемблере
Задание Дано натуральное число n и целые числа a1...an. Найти и вывести наибольший член последовательности. Текст программы
cseg segment 'code'
assume cs:cseg, ds:dseg, ss:sseg
mypr proc
mov ax,sseg mov ss,ax mov sp, offset ukazst
mov ax,dseg mov ds,ax ; вывод запроса на ввод N
mov AH,09h ; вызов функции вывода на экран
mov DX,offset msg ; вывод сообщения
int 21h mov cx,3 ;установка числа повторений цикла на 3
;ввод N
met1:
mov ah,01h; ожидание набора символа
int 21h; прерывание
sub al,30h; смещение в таблице
mov bx,numb ; число в регистр bx
xor ah,ah; обнуление ah
mov numb,ax; из регистра ax в число
mov ax,10 ; добавление
mul bx; очередного
add ax,numb ; разряда mov numb,ax ; числа
loop met1
mov AH,09h ; вызов функции вывода на экран
mov DX,offset prob ; вывод сообщения
int 21h ;очистка экрана
xor ax,ax ; очистка регистра ах
mov si,numb ; количество членов последовательности
mov numb,0 ;очистка numb
;ввод последовательности чисел
f1:
mov cx,3 ;установка числа повторений цикла на 3
met:
mov ah,01h; ожидание набора символа
int 21h; прерывание
sub al,30h; смещение в таблице
mov bx,numb ; число в регистр bx
xor ah,ah; обнуление ah
mov numb ,ax; из регистра ax в число
mov ax,10 ; добавление
mul bx; очередного
add ax,numb ; разряда mov numb ,ax ; числа
loop met
xor ax,ax ;очистка регистра ах
mov ax,numb ; помещение элемента последовательности в регистр ах
mov numb,0 ;очистка numb
mov bx,2 ; помещение в регистр bx делителя 2
div bx ;деление на 2
cmp dx, 1 ;сравнение остатка от деления с 1
jne pr ; если не равно 1, то переход на метку pr
je f2 ; если равно 1, то переход на метку f2
pr: div bx ;деление на 2
cmp dx, 1 ;сравнение остатка от деления с 1
je plus ; если равно 1, то переход на метку plus
jne f2 ;если не равно 1, то переход на метку f2
plus:
inc(di) ; увеличение содержимого регистра di на 1 (подсчет удвоенных нечетных элементов последовательности)
f2: mov AH,09h ; вызов функции вывода на экран
mov DX,offset prob ; вывод сообщения
int 21h ;очистка экрана
dec si;уменьшение значения счетчика цикла на 1
cmp si, 0 ;сравнение содержимого регистра si с 0
jne f1 ; если не равно 1, то переход на метку f1
mov AH,09h ; вызов функции вывода на экран
mov DX,offset prob ; вывод сообщения
int 21h ;перевод числа удвоенных нечетных элементов последовательности из шестнадцатеричной системы в десятичную
xor si,si ;очистка регистра si
mov ax, di ; помещение в регистр ax числа удвоенных нечетных элементов последовательности
mov bx,10 ; помещение в регистр bx основания десятичной системы счисления
f3:
xor dx,dx ;очистка регистра dx div bx ; деление на 10
add dx, 30h ; смещение остатка от деления по таблице
push dx ;помещение результата в стек
inc(si) ; увеличение содержимого регистра si на 1
cmp ax,0 ;сравнение регистра ax с 0
jne f3 ;если не равно 0, то преход на метку f3
mov cx,si ;помещение содержимого регистра si в cx
mov si,offset string; адрес результата
stroka:
pop ax ;извлечение вершины стека в регистр ах
mov word ptr [si],ax; отправим в строку результата
inc(si) ;сдвиг по сегменту
loop stroka
mov ah,09h; функция вывода на экран
mov dx,offset string ;вывод результата
int 21h; вызов прерывания для вывода на экран
mov ax,4c00h ; функция завершения работы int 21h ; прерывание
cseg ends
; сегмент данных
dseg segment
string db 5 dup(' '),'$'
numb dw 0
msg db 'Vvedite N $' prob db ' $'
dseg ends
; сегмент стека
sseg segment dw 50 dup(?)
ukazst label word
sseg ends
end mypr
Вывод
В результате выполнения лабораторной работы были изучены ассемблерные команды передачи управления. 2
Документ
Категория
Рефераты
Просмотров
23
Размер файла
89 Кб
Теги
оси5
1/--страниц
Пожаловаться на содержимое документа