Консольні програми розробляються в MASM32.
1. Розробити програму, котра перенаправляє вивід поточного дня тижня (Понеділок, …) з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
2. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточну директорію розміщення системних файлів ОС Windows. Результат вивести у вікно повідомлення.
3. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточні координати курсору, інша має зчитати цей запис і вивести його у вікні повідомлення.
4. Розробити програму, котра перенаправляє вивід поточного часу (00:00:00) з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
5. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточний день тижня (Понеділок,…), інша має зчитати цей запис і вивести його у вікні повідомлення.
6. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточне ім’я користувача, інша має зчитати цей запис і вивести його у вікні повідомлення.
|
|
7. Розробити програму, котра перенаправляє вивід поточного імені комп’ютера з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
8. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточний час (00:00:00). Результат вивести у вікно повідомлення.
9. Розробити програму, котра перенаправляє вивід поточного місяця (Січень,…) з консольної програми у вікно повідомлення за допомогою анонімного пайпу
10. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточні координати курсору. Результат вивести у вікно повідомлення.
11. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточний місяць (Січень,…) інша має зчитати цей запис і вивести його у вікні повідомлення.
12. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточний місяць (Січень,..). Результат вивести у вікно повідомлення.
13. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточне ім’я комп’ютера, інша має зчитати цей запис і вивести його у вікні повідомлення.
14. Розробити програму, котра перенаправляє вивід поточної директорії розміщення ОС Windows з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
15. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточне ім’я комп’ютера. Результат вивести у вікно повідомлення.
|
|
16. Розробити програму, котра перенаправляє вивід поточних координат курсору з консольної програми у вікно повідомлення за допомогою анонімного пайпу
17. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточний час (00:00:00), інша має зчитати цей запис і вивести його у вікні повідомлення.
18. Розробити програму, котра перенаправляє вивід поточної директорії розміщення системних файлів ОС Windows з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
19. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточний місяць (Січень,..). Результат вивести у вікно повідомлення.
20. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточну дату (00.00.00), інша має зчитати цей запис і вивести його у вікні повідомлення.
21. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточну дату (00.00.00). Результат вивести у вікно повідомлення.
22. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточну директорію розміщення ОС Windows, інша має зчитати цей запис і вивести його у вікні повідомлення.
23. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточний день тижня (Понеділок,…). Результат вивести у вікно повідомлення.
24. Використовуючи синхронізацію процесів розробити програми, котрі взаємодіють через файл. Одна програма має записувати у файл поточну директорію розміщення системних файлів ОС Windows, інша має зчитати цей запис і вивести його у вікні повідомлення.
25. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточне ім’я користувача. Результат вивести у вікно повідомлення.
26. Розробити програму, котра перенаправляє вивід поточної дати (00.00.00) з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
27. Розробити програми, котрі за допомогою іменованих каналів передають між собою поточну директорію розміщення ОС Windows. Результат вивести у вікно повідомлення.
28. Розробити програму, котра перенаправляє вивід поточного імені користувача з консольної програми у вікно повідомлення за допомогою анонімного пайпу.
Контрольні запитання
1. Назвати основні механізми міжпроцесової взаємодії.
2. Назвати основні механізми синхронізації процесів та потоків.
3. Які об’єкти використовують для синхронізації процесів та потоків?.
4. Назвати основні типи очікуючих функцій.
5. Що таке атом?
6. Як компонувати та транслювати консольні програми в MASM32?
Список використаної літератури
1. Help по функціях API - www.nan32asm.cjb.net
2. Microsoft Windows Help - Win32 Programmers Reference
3. Технічна документація Microsoft - MSDN
Додаток 1
Текст програми синхронізації спільного доступу до файлу.
Дана програма створює семафор та файл і чекає на під’єднання іншої програми.
----------------------------------
; Sem_File.asm
;----------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
wsprintfA PROTO C:DWORD,:VARARG
wsprintf equ <wsprintfA>
.data
MsgCaption db "Повiдомлення!",0
ErrorCreateSem db "Помилка створення семафору",0
ErrorCreateFile db "Помилка створення файлу",0
ErrorWriteFile db "Помилка запису у файл",0
Message db "Повiдомлення для файлу",0
Success db "Успiшне завершення програми",0
TimeOut db "Завершився час очiкування",0
ErrorRelease db "Помилка знищення семафору",0
|
|
buffer db 256 dup (?)
parameter db "%u"
check DWORD 0
written DWORD 0
sName db "MySemaphore",0
fName db "C:\Temp\MYFILE.TXT",0
.data?
hSemaphore HANDLE?
hFile HANDLE?
.code
start:
invoke CreateSemaphore, NULL, 0, 1, addr sName
.if eax==0
invoke MessageBox, NULL,addr ErrorCreateSem,\
addr MsgCaption, MB_OK
jmp exit
.endif
mov hSemaphore, eax
invoke CreateFile, addr fName,\
GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ, NULL, CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL,NULL
.if eax==INVALID_HANDLE_VALUE
invoke GetLastError
invoke wsprintf,addr buffer,addr parameter,eax
invoke MessageBox, NULL,addr ErrorCreateFile, \
addr buffer, MB_OK
invoke ReleaseSemaphore, hSemaphore, 1, NULL
jmp exit
.endif
mov hFile, eax
invoke WriteFile, hFile, addr Message, 23,\
addr written, NULL
.if eax==0
invoke GetLastError
invoke wsprintf,addr buffer,addr parameter,eax
invoke MessageBox, NULL,addr ErrorWriteFile,\
addr buffer, MB_OK
invoke ReleaseSemaphore, hSemaphore, 1, NULL
jmp exit
.endif
invoke CloseHandle, hFile
invoke WaitForSingleObject, hSemaphore, 10000
.if eax==WAIT_OBJECT_0
invoke MessageBox, NULL,addr Success,\
addr MsgCaption, MB_OK
invoke ReleaseSemaphore, hSemaphore, 1, NULL
jmp exit
.endif
.if eax==WAIT_TIMEOUT
invoke MessageBox, NULL, addr TimeOut, \
addr MsgCaption, MB_OK
invoke ReleaseSemaphore, hSemaphore, 1, NULL
.if eax==0
invoke GetLastError
invoke wsprintf,addr buffer,\
addr parameter,eax
invoke MessageBox, NULL, addr ErrorRelease,\
addr buffer, MB_OK
jmp exit
.endif
jmp exit
.endif
exit:
invoke ExitProcess,NULL
end start
Результат виконання програми:
Дана програма створює семафор та файл, записує у файл інформацію, очікує поки інша програма не прочитає даний файл і не знищить семафор.
У випадку успішного створення семафору і файлу, та зчитування з файлу, результат має виглядати так:
Додаток 2
Текст програми, котра відкриває семафор, зчитує дані з файлу та знищує семафор.
;----------------------------------
; Sem_Read.asm ;
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
;wsprintfA PROTO C:DWORD,:VARARG
;wsprintf equ <wsprintfA>
.data
MsgCaption db "Повiдомлення!",0
ErrorOpenSem db "Помилка вiдкриття семафору",0
ErrorCreateFile db "Помилка створення файлу",0
ErrorReadFile db "Помилка зчитування з файл",0
ErrorReleaseSem db "Помилка знищення семафору",0
;buffer db 256 dup (?)
|
|
;parameter db "%u"
check DWORD 0
Readed DWORD 0
fBuffer db 25 dup (0)
sName db "MySemaphore",0
fName db "C:\Temp\MYFILE.TXT",0
.data?
hSemaphore HANDLE?
hFile HANDLE?
.code
start:
invoke OpenSemaphore, SEMAPHORE_ALL_ACCESS, TRUE, addr sName
.if eax==0
invoke MessageBox, NULL,addr ErrorOpenSem, addr MsgCaption, MB_OK
jmp exit
.endif
mov hSemaphore, eax
invoke CreateFile, addr fName, GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL
.if eax==INVALID_HANDLE_VALUE
invoke MessageBox, NULL,addr ErrorCreateFile, addr MsgCaption, MB_OK
invoke ReleaseSemaphore, hSemaphore, 1, NULL
jmp exit
.endif
mov hFile, eax
invoke ReadFile, hFile, addr fBuffer, 25,addr Readed, NULL
.if eax==0
invoke MessageBox, NULL,addr ErrorReadFile, addr MsgCaption, MB_OK
invoke ReleaseSemaphore, hSemaphore, 1, NULL
jmp exit
.endif
invoke MessageBox, NULL,addr fBuffer, addr MsgCaption, MB_OK
invoke CloseHandle, hFile
invoke ReleaseSemaphore, hSemaphore, 1, NULL
.if eax==0
invoke MessageBox, NULL,addr ErrorReleaseSem, addr MsgCaption, MB_OK
jmp exit
.endif
exit:
invoke ExitProcess,NULL
end start
Додаток 3
Текст програми створення глобального атома.
;----------------------------------
; AddAtom.asm
;----------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
MsgCaption db "Повiдомлення!",0
MyAtom DWORD 0
AtomName db "Привіт атом",0
ErrorAddAtom db "Неможливо створити атом",0
Success db "Атом успiшно створено",0
.code
start:
invoke GlobalAddAtom, addr AtomName
.if eax==0
invoke MessageBox, NULL,addr ErrorAddAtom,\
addr MsgCaption, MB_OK
jmp exit
.endif
mov MyAtom, eax
invoke MessageBox, NULL,addr Success,\
addr MsgCaption, MB_OK
exit:
invoke ExitProcess,NULL
end start
Результат виконання програми:
Опис програми:
Дана програма створює за допомогою функції GlobalAddAtom глобальний атом, тобто атом, котрий можуть “бачити” інші програми.
Для того, щоб звернутися до глобально атома (дізнатись його ім’я), потрібно використовувати функцію GlobalGetAtomName, якій потрібно передати дескриптор, котрий був отриманий після створення атома. Цей дескриптор може наслідуватись для використання іншими програмами. Для того, щоб дізнатись значення атома (ідентифікатор імені атома в таблиці атомів) потрібно використовувати функцію GlobalGetAtom, котрій передається параметром ім’я атома.
Додаток 4
Текст програми відкриття глобального атома.
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
wsprintfA PROTO C:DWORD,:VARARG
wsprintf equ <wsprintfA>
.data
MsgCaption db "Повiдомлення!",0
MyAtom DWORD 0
AtomName db "Привіт Атом",0
MyAtomName db "Iм’я атома",0
ErrorFindAtom db "Атома з таким iм'ям не iснує",0
ErrorDA db "Помилка знищення атома",0
Success db "Атом успiшно знайдено",0
SuccessDA db "Aтом успiшно знищено",0
AtomCaption db "Значення атома в таблицi атомiв",0
buffer db 256 dup (?)
parameter db "%u"
.code
start:
invoke GlobalFindAtom,addr AtomName
.if eax==0
invoke MessageBox, NULL,addr ErrorFindAtom, addr MsgCaption, MB_OK
jmp exit
.endif
mov MyAtom, eax
invoke MessageBox, NULL,addr Success, addr MsgCaption, MB_OK
invoke wsprintf,addr buffer,addr parameter,MyAtom
invoke MessageBox, NULL, addr buffer, addr AtomCaption, MB_OK
invoke GlobalGetAtomName, MyAtom,addr buffer,256
invoke MessageBox, NULL,addr buffer, addr MyAtomName, MB_OK
invoke GlobalDeleteAtom, MyAtom
.if eax==0
invoke MessageBox, NULL,addr SuccessDA,\
addr MsgCaption, MB_OK
jmp exit
.endif
invoke MessageBox, NULL,addr ErrorDA, addr MsgCaption, MB_OK
exit:
invoke ExitProcess,NULL
end start
Результат виконання програми:
Додаток 5