Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Звіт
з предмету
“Системне програмування і операційні системи”
з лабораторної роботи №8
Підготував:
студент групи КН-21
Максимовський Андрій
Перевірила:
Павлюк О.М.
Львів - 2010
Лабораторна робота №8
Тема – Використання технології OLE
Мета – Зрозуміти принципи виклику функцій OLE на асемблері.
Теоретичні відомості
ExitProcess завершує процес і всі його потоки.
VOID ExitProcess
UINT uExitCode / / код виходу для всіх потоків
Функція MessageBox створює, відображає і управляє вікні повідомлення. Вікно повідомлень містить додаток певних повідомлень і назви, а також будь-яку комбінацію зумовлених іконок і натискати кнопки.
Int MessageBox
HWnd HWND, / / дескриптор вікна власника
LPCTSTR lpText, / / адреса тексту у вікні повідомлення
LPCTSTR lpCaption, / / адреса Тема повідомлення вікна
UINT uType / / Стиль вікна повідомлення
GlobalAlloc розміщує вказане число байтів від купи. У лінійному Win32 оточенні програмного ІНТЕРФЕЙСУ додатка, є жодна різниця між місцевою купою і глобальною купою.
HGLOBAL GlobalAlloc
UINT uFlags // властивості розміщення об'єкту
DWORD dwBytes // число байтів до асигнування
GlobalLock замикає об'єкт глобальної пам'яті і повертає покажчик першому байту блоку пам'яті об'єкту. Блок пам'яті зв'язався із замкнутим об'єктом пам'яті не може бути переміщений або відкинутий. Для об'єктів пам'яті, розміщених з прапором GMEM_MOVEABLE, функція збільшує замкового графа, що асоціюється з об'єктом пам'яті.
LPVOID GlobalLock(
HGLOBAL hMem // адреса об'єкту глобальної пам'яті
GlobalUnlock зменшує замкового графа, що асоціюється з об'єктом пам'яті, який був розміщений з прапором GMEM_MOVEABLE. Ця функція має жоден ефект на об'єктах пам'яті, розміщених з прапором GMEM_FIXED.
BOOL GlobalUnlock(
HGLOBAL hMem // ручка до об'єкту глобальної пам'яті
GetDeviceCaps відновлює специфічну для пристрою інформацію про вказаний пристрій.
int GetDeviceCaps(
HDC hdc // контекстна для пристрою ручка
int nIndex // індекс властивості поставити під сумнів
GetClientRect відновлює координати client зони вікна. Client координати конкретизують верхні ліві і нижні праві кути client області. Оскільки client координати відносні до верхнього лівого кута client зони вікна, координати верхнього лівого кута є (0,0).
BOOL GetClientRect(
HWND hWnd // ручка вікна
LPRECT lpRect // адреса структури для client координат
ReadFile читає дані з файлу, починаючись при положенні, вказаному by покажчик файлу. Після того, як операція читання даних була завершена, покажчик файлу скоректований by число байтів фактично читання, якби тільки ручка файлу створювалася з частково покритою властивістю. Якщо ручка файлу створюється для частково покритого входу і output (I/O), додаток повинен регулювати позицію покажчика файлу після операції читання даних.
BOOL ReadFile(
УПРАВЛЯЙТЕ hFile // ручка файлу для читання
LPVOID lpBuffer // адреса буфера, який отримує дані
DWORD nNumberOfBytesToRead // число байтів для читання
LPDWORD lpNumberOfBytesRead // адреса числа вичитаних байтів
LPOVERLAPPED lpOverlapped // адреса структури для даних
CreateFile створює або відкриває наступні об'єкти і повертає ручку, яка може бути used, аби звернутися до об'єкту:
УПРАВЛЯЙТЕ CreateFile(
LPCTSTR lpFileName // покажчик на ім'я файлу
DWORD dwDesiredAccess // (запис читання) режим доступ
DWORD dwShareMode // метод долі
LPSECURITY_ATTRIBUTES lpSecurityAttributes // покажчик на атрибути секретності
DWORD dwCreationDistribution //, як створити
DWORD dwFlagsAndAttributes // атрибути файлу
УПРАВЛЯЙТЕ hTemplateFile // ручка, аби представити з властивостями для копіювання
GetFileSize відновлює розмір, в байтах, з вказаного файлу.
DWORD GetFileSize(
УПРАВЛЯЙТЕ hFile // ручка файлу, аби отримати розмір
LPDWORD lpFileSizeHigh // адреса старшого слова для розміру файлу
CloseHandle закриває відкриту об'єктну ручку.
BOOL CloseHandle(
УПРАВЛЯЙТЕ hObject // ручка, аби заперечити для закриття
MulDiv умножає два 32-розрядні значення а потім ділить 64-розрядний результат на третє 32-розрядне значення. Повертане значення зігнане або внизу до найближчого цілого числа.
int MulDiv(
int nNumber // 32-шматок підписав співмножник
int nNumerator // 32-шматок підписав множник
int nDenominator // 32-шматок підписав дільника
GETDC відновлює ручку контексту (DC) пристрою показу для client зони вказаного вікна. Контекст пристрою показу може бути used в подальших функціях GDI, аби тягнути в client зоні вікна.
Ця функція відновлює загальний, клас, або приватний контекст пристрою залежно від класового стилю конкретизував для вказаного вікна. Для загальних контекстів пристрою, GETDC призначає стандартні атрибути контексту пристрою кожного разу, коли це відновлено. Для класових і приватних контекстів пристрою, GETDC залишає заздалегідь призначені незмінні властивості.
HDC GETDC(
HWND hWnd // ручка вікна
RELEASEDC випускає контекст (DC) пристрою, звільняючи це для використання by інші застосування. Ефект функції RELEASEDC залежить від вигляду контексту пристрою. Він звільняє лише загальним і контексти пристрою вікна. Це має жоден ефект на класових або приватних контекстах пристрою.
int RELEASEDC(
HWND hWnd // ручка вікна
HDC hDC // ручка контексту пристрою
CreateWindowEx створює частково покривають, pop-up, або дитяче вікно з розширеним стилем; інакше, ця функція ідентична функції CreateWindow. Для більш конкретної інформації про створення вікна і для повних описів інших параметрів CreateWindowEx, бачать CreateWindow.
HWND CreateWindowEx(
DWORD dwExStyle // розширив стиль вікна
LPCTSTR lpClassName // покажчик на зареєстроване класове ім'я
LPCTSTR lpWindowName // покажчик на ім'я вікна
DWORD dwStyle // стиль вікна
int x // позиція горизонталі вікна
int y // vertical позиція вікна
int nWidth // вікно шириною
int nHeight // висота вікна
HWND hWndParent // ручка до батьківського або owner вікна
HMENU hMenu // ручка до меню, або ідентифікатора вікна дитяти
HINSTANCE hInstance // ручка до прикладного зразка
LPVOID lpParam // покажчик на дані створення вікна
GetModuleHandle повертає module ручку для вказаного модуля, якщо файл був mapped в адресному просторі дзвонячого процесу.
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // адреса module імені, аби повернути ручку
SendMessage відправляє вказане повідомлення вікну або вікнам. Звернення до функції процедура вікна для вказаного вікна і не повертається, поки процедура вікна не обробила повідомлення. Функція PostMessage, в контрасті, вивішує повідомлення черги повідомлень нитки і повертається негайно.
LRESULT SendMessage(
HWND hWnd // ручка вікна призначення
Повідомлення UINT // повідомлення для послання
WPARAM wParam // перший параметр повідомлення
LPARAM lParam // параметр повідомлення помічника
GetPixel відновлює червоне, зелене, блакитне (RGB), кольорове значення пікселя у вказаних координатах.
COLORREF GetPixel(
HDC hdc // ручка контексту пристрою
int XPos // x-coordinate пікселя
int nYPos // y-coordinate пікселя
SetPixel встановлює піксель у вказаних координатах до вказаного кольору.
COLORREF SetPixel(
HDC hdc // ручка контексту пристрою
int X // x-coordinate пікселя
int Y // y-coordinate пікселя
COLORREF crColor // колір пікселя
.586
.model flat,STDCALL
extrn GlobalAlloc:Proc
extrn GlobalLock:Proc
extrn GlobalUnlock:Proc
extrn GetDeviceCaps:Proc
extrn GetClientRect:Proc
extrn ReadFile:Proc
extrn CreateFileA:Proc
extrn GetFileSize:Proc
extrn CloseHandle:Proc
extrn MulDiv:Proc
extrn GetDC:Proc
extrn ReleaseDC:Proc
extrn ExitProcess:Proc
extrn CreateWindowExA:Proc
extrn CreateStreamOnHGlobal:Proc
extrn OleLoadPicture:Proc
extrn GetModuleHandleA:Proc
extrn MessageBoxA:Proc
extrn SendMessageA:Proc
extrn LoadImageA:Proc
extrn GetPixel:proc
extrn SetPixel:proc
.data
HWnd dd 0
HDC dd 0
HMWidth dd 0
Width1 dd 0
HMHeight dd 0
Height dd 0
RECT dd 0,0,0,0 ;left,top,right,bottom
RECT1 dd 0,0,0,0
PICTURE_NAME db 'test.jpg',0
buf1 db 'Ôðàãìåíòàö³ÿ ìàëþíêà',0
buf db 'Press OK',0
buf2 db 'Çìåíøåííÿ ðîçì³ðó\Âèëó÷åííÿ çåíåíîãî êîëüîðó',0
HFile dd 0
File_Size dd 0
HGlobal dd 0
NUM_READ dd 0
PSTM dd 0
;iäåíòèôiêàòîð iíòåðôåéñó IPicture, ÿêèé âçÿòèé ç ðåºñòðó:
IID_IPicture dd 7bf80980h ; HKEY_CLASSES_ROOT\Interface\
dw 0bf32h, 101ah ; {7BF80980-BF32-101A-8BBB-00AA00300CAB}
db 8bh, 0bbh
db 00h, 0aah, 00h, 30h, 0ch, 0abh
GPICTURE dd 0
CLASSNAME db 'Static',0
AppHWnd dd 0
hphoto dd 0
eax1 dd 0
lichX dd 0
lichY dd 0
lichX1 dd 0
lichY1 dd 0
tmp_color dd 0
p1 dd 0
Rop db 'SRCAND',0
HDC1 dd 0
.code
Start:
call CreateFileA, offset PICTURE_NAME, 80000000h,0,0,3,0,0
cmp eax,-1
jz STOP
mov HFile,eax
call GetFileSize,HFile,0
mov File_Size,eax
call GlobalAlloc, 2, File_Size
mov HGlobal,eax
call GlobalLock,eax
call ReadFile, HFile, eax, File_Size, offset NUM_READ,0
call GlobalUnlock, HGlobal
call CloseHandle, HFile
call CreateStreamOnHGlobal, HGlobal, 1, offset PSTM
mov eax,PSTM ; çàâàíòàæèòè ôàéë ó ïîòiê
or eax,eax
jz STOP
call OleLoadPicture,PSTM,File_Size,0,offset IID_IPicture,offset GPICTURE
or eax,eax ; ñêîðèñòàòèñü ³íòåðôåéñîì îá'ºêò IPicture
jnz STOP
mov edx,PSTM ; coinvoke PSTM,IUnknown,Release
mov edx,[edx]
push PSTM
call Dword ptr [edx+8h]
mov edx, GPICTURE ; âèêîðèñòàííÿ ìåòîäó OLE
mov edx, [edx] ; IPicture::get_Width (18h)
push offset HMWidth
push GPICTURE
call Dword ptr [edx+18h]
mov edx, GPICTURE ; âèêîðèñòàííÿ ìåòîäó OLE
mov edx, [edx] ; IPicture::get_Height (1Ch)
push offset HMHeight
push GPICTURE
call Dword ptr [edx+1Ch]
call GetDC,HWnd
mov HDC,eax
call GetDeviceCaps, HDC,88 ; LOGPIXELSX
call MulDiv, HMWidth,eax,254*8 ;9ECh ; HIMETRIC_INCH
mov Width1, eax
call GetDeviceCaps, HDC,90 ; LOGPIXELSY
call MulDiv, HMHeight,eax,254*8 ;9ECh ; HIMETRIC_INCH
mov Height, eax
call GetClientRect, HWnd, offset RECT
mov edx, GPICTURE ; âèêîðèñòàííÿ ìåòîäó OLE
mov edx, [edx] ; IPicture::Render (20h)
mov eax, HMHeight
mov eax1,eax
neg eax
call [edx+20h],GPICTURE,HDC,0,0,Width1,Height,0,HMHeight,HMWidth,eax,offset RECT
mov lichY1,400
mov lichX1,500
.WHILE (lichY1<554)
mov edx, Width1
.WHILE (lichX1<750)
call GetPixel,HDC,lichX,lichY
mov tmp_color,eax
call GetPixel,HDC,lichX1,lichY1
call SetPixel,HDC,lichX,lichY,eax
call SetPixel,HDC,lichX1,lichY1,tmp_color
inc lichX
inc lichX1
.ENDW
mov lichX,0
mov lichX1,500
inc lichY
inc lichY1
.ENDW
call ReleaseDC,AppHWnd,HDC
call MessageBoxA,0,offset buf,offset buf1,30h
;-----------------------------------------------------------------------------------------
call CreateWindowExA,8h,offset CLASSNAME,0,80000000h or 010000000h or 0Eh or 1000h ,800,250,250,190,0,0,0,0
mov AppHWnd,eax
call CreateFileA, offset PICTURE_NAME, 80000000h,0,0,3,0,0
cmp eax,-1
jz STOP
mov HFile,eax
call GetFileSize,HFile,0 ; îòðèìàòè äîâæèíó ôàéëó
mov File_Size,eax
call GlobalAlloc, 2, File_Size
mov HGlobal,eax
call GlobalLock,eax
call ReadFile, HFile, eax, File_Size, offset NUM_READ,0
call GlobalUnlock, HGlobal
call CloseHandle, HFile
mov PSTM,0
call CreateStreamOnHGlobal, HGlobal, 1, offset PSTM
mov eax,PSTM ; çàâàíòàæèòè ôàéë ó ïîòiê
or eax,eax
jz STOP
call OleLoadPicture,PSTM,File_Size,0,offset IID_IPicture,offset GPICTURE
or eax,eax ; ñêîðèñòàòèñü ³íòåðôåéñîì îá'ºêò IPicture
jnz STOP
mov edx,PSTM ; coinvoke PSTM,IUnknown,Release
mov edx,[edx]
push PSTM
call dword ptr [edx+8h]
mov edx, GPICTURE ; âèêîðèñòàííÿ ìåòîäó OLE
mov edx, [edx] ; IPicture::get_Width (18h)
push offset HMWidth
push GPICTURE
call Dword ptr [edx+18h]
mov edx, GPICTURE ; âèêîðèñòàííÿ ìåòîäó OLE
mov edx, [edx] ; IPicture::get_Height (1Ch)
push offset HMHeight
push GPICTURE
call Dword ptr [edx+1Ch]
call GetDC,AppHWnd
mov HDC,eax
call GetDeviceCaps, HDC,88 ; LOGPIXELSX
call MulDiv, HMWidth,eax,6000;9ECh ; HIMETRIC_INCH
mov Width1, eax
call GetDeviceCaps, HDC,90 ; LOGPIXELSY
call MulDiv, HMHeight,eax,6000 ;9ECh ; HIMETRIC_INCH
mov Height, eax
call GetClientRect, AppHWnd, offset RECT
mov edx, GPICTURE ; âèêîðèñòàííÿ ìåòîäó OLE
mov edx, [edx] ; IPicture::Render (20h) ; IPicture::Render (20h)
mov eax, HMHeight
neg eax
mov p1,eax
call [edx+20h],GPICTURE,HDC,0,0,Width1,Height,0,HMHeight,HMWidth,p1,offset RECT
mov lichY,0
mov lichX,0
.WHILE (lichY<188)
mov edx, Width1
.WHILE (lichX<248)
call GetPixel,HDC,lichX,lichY
and eax,0ff00ffh
call SetPixel,HDC,lichX,lichY,eax
inc lichX
.ENDW
mov lichX,0
inc lichY
.ENDW
call ReleaseDC,AppHWnd,HDC
call MessageBoxA,0,offset buf2,offset buf,30h
STOP: call ExitProcess,0
end Start
Висновок: під час лабораторної роботи я навчитися розуміти принципи виклику функцій OLE на асемблері.