Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра АСУ
Лабораторна робота №8
Робота з COM,OLE, регулярними виразами.
Написав: ст. гр.. КН-22
Прийняв:
Скрибайло-Леськів Д.Ю
Львів 2011
Тема: Робота з COM,OLE, регулярними виразами.
Мета: Навчитися використовувати у власних програмах стандартні COM-об’єкти. Опанувати навики роботи з регулярними виразами.
Теоретичні положення:
COM (англ. Component Object Model - об'єктна модель компонентів, вимовляється як [ком]) - це технологічний стандарт від компанії Microsoft, призначений для створення програмного забезпечення на основі взаємодіючих розподілених компонентів, кожен з яких може використовуватися в багатьох програмах одночасно. Стандарт втілює в собі ідеї поліморфізму та інкапсуляції об'єктно-орієнтованого програмування. Стандарт COM міг би бути універсальним і платформо-незалежним, але закріпився в основному на операційних системах сімейства Microsoft Windows. У сучасних версіях Windows COM використовується дуже широко. На основі COM були реалізовані технології: Microsoft OLE Automation, ActiveX, DCOM, COM +, DirectX, а також XPCOM.
Принципи роботи COM
Основним поняттям, яким оперує технологія COM, є COM-компонент. Програми, побудовані на технології COM, фактично не є автономними програмами, а представляють собою набір взаємодіючих між собою COM-компонентів. Кожен компонент має унікальний ідентифікатор (GUID) і може одночасно використовуватися багатьма програмами. Компонент взаємодіє з іншими програмами через COM-інтерфейси - набори абстрактних функцій і властивостей. Кожен COM-компонент має, як мінімум, підтримувати стандартний інтерфейс «IUnknown», який надає базові засоби для роботи з компонентом. Інтерфейс «IUnknown» включає в себе три методи: QueryInterface, AddRef, Release.
Windows API надає базові функції, що дозволяють використовувати COM-компоненти. Бібліотеки MFC і, особливо, ATL / WTL надають набагато гнучкіші і зручніші засоби для роботи з COM. Бібліотека ATL від Microsoft до цих пір залишається найпопулярнішим засобом створення COM-компонентів. Але, часто, COM-розробка залишається ще досить складною справою, програмістам доводиться вручну виконувати багато рутинних завдань, пов'язаних з COM (особливо це помітно у разі розробки на C + +). Згодом (у технологіях COM + і особливо. NET) Microsoft спробував спростити завдання розробки COM-компонентів.
Завдання:
Використовуючи інтерфейс VBScript Regular Expressions написати програму з власнім користувацький вікном в якому буде здійснюватися перевірка правильності введення даних, зокрема. Номеру телефону, адресі електронної скриньки, дробового числа.
Реалізувати керування Microsoft Agent 2.0 Merlin. Рух, графічні ефекти, читання.
Написати корисний ужиток для переглядання графічних зображень. Покрокове переглядання слайд-шоу.
Реалізувати програму роботи з Microsoft Excel. Створити 4 стовпчики. Занести 1) кут 2)sin 3)cos 4)tag
Реалізувати програму роботи з Microsoft Word. Написати програму для автоматичного створення договору оренди квартири.
Реалізувати програму роботи з Microsoft Excel. Відкрити документ, та на основі таблиці, у документі, намалювати графік.
Реалізувати програму роботи з Microsoft Word Використовуючи інтерфейс VBScript Regular Expressions визначити та вивести у вікні програми, не кириличні слова з відкритого документу.
Використовуючи інтерфейс VBScript Regular Expressions написати програму для заміні слів у текстовому документі на основі регулярного виразу.
Використовуючи інтерфейс VBScript Regular Expressions написати програму для заміні слів у документі Microsoft Word на основі регулярного виразу.
Реалізувати керування Microsoft Agent 2.0 Merlin. Рух, «натискання на іконки робочого столу»
Реалізувати програму роботи з Microsoft Excel. З текстового файлу, в якому міститься список студентів, та оцінки по предметам, створити табличку у Excel і визначити середній бал кожного студента.
Використовуючи інтерфейс регулярних виразів написати програму для витягування посилань на графічні документи. Фільтр посилань прописувати в ручну.
Код програми:
Asm-файл
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include Lab_7_1.inc
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0
;########################################################################
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_INITDIALOG
invoke CreateInterface
invoke RegExp_Method, FLAG_GLOBAL, SETFLAG
invoke RegExp_Method, FLAG_IGNORECASE, SETFLAG
.elseif eax==WM_COMMAND
.if wParam==1008 ;Count
mov ok,1
invoke GetDlgItemText,hWin,1005,addr buff,256
cmp buff,0
jnz er01
mov ok,0
invoke SetDlgItemText,hWin,1005,addr Error01
jmp l1
er01: invoke RegExp_Pattern, offset Expression1, offset ResBuffer, 512
invoke RegExp_Replace, offset buff, offset DataBuffer, 512, \
offset rVar, offset ResBuffer, 512
invoke lstrcmp,addr ResBuffer,addr rVar
cmp eax,0
jz l1
invoke SetDlgItemText,hWin,1005,addr Error1
mov ok,0
l1: mov buff,0
invoke GetDlgItemText,hWin,1006,addr buff,256
cmp buff,0
jnz er02
mov ok,0
invoke SetDlgItemText,hWin,1006,addr Error02
jmp l2
er02: invoke RegExp_Pattern, offset Expression2, offset ResBuffer, 512
invoke RegExp_Replace, offset buff, offset DataBuffer, 512, \
offset rVar, offset ResBuffer, 512
invoke lstrcmp,addr ResBuffer,addr rVar
cmp eax,0
jz l2
invoke SetDlgItemText,hWin,1006,addr Error2
mov ok,0
l2: mov buff,0
invoke GetDlgItemText,hWin,1007,addr buff,256
cmp buff,0
jnz er03
mov ok,0
invoke SetDlgItemText,hWin,1007,addr Error03
jmp l3
er03: invoke RegExp_Pattern, offset Expression3, offset ResBuffer, 512
invoke RegExp_Replace, offset buff, offset DataBuffer, 512, \
offset rVar, offset ResBuffer, 512
invoke lstrcmp,addr ResBuffer,addr rVar
cmp eax,0
jz l3
invoke SetDlgItemText,hWin,1007,addr Error3
mov ok,0
l3: cmp ok ,0
jz m1
invoke MessageBox,0,addr Title1,addr Cap1,MB_OK
m1: .elseif wParam==1009 ;Exit
jmp exit
.endif
.elseif eax==WM_CLOSE
exit: invoke ReleaseInterface
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
Inc-файл
include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
include ole32.inc
include oleaut32.inc
include Comctl32.inc
includelib Comctl32.lib
includelib ole32.lib
includelib kernel32.lib
includelib oleaut32.lib
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
CreateInterface proto
ReleaseInterface proto
AddRef proto
RegExp_Method proto :DWORD,:DWORD
RegExp_Pattern proto :DWORD,:DWORD,:DWORD
RegExp_Test proto :DWORD,:DWORD,:DWORD
RegExp_Replace proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
_MULTI_QI struct
pIID dd ?
pItf dd ?
hr dd ?
_MULTI_QI ends
.const
IDD_DIALOG1 equ 101
IDC_EDIT1 equ 1000
IDC_EDIT2 equ 1001
IDB_ProgID equ 1002
IDB_CLSID equ 1003
FLAG_GLOBAL equ 30h ;RegExp.Global
FLAG_IGNORECASE equ 28h ;RegExp.IgnoreCase
FLAG_MULTILINE equ 38h ;RegExp.MultiLine
CLRFLAG equ 0
SETFLAG equ -1
.data
ok db 1
Cap1 db "Перевірку завершено",0
Title1 db "Всі дані введені правильні",0
Error01 db "Введіть номер",0
Error02 db "Введіть е-mail",0
Error03 db "Введіть число",0
Error1 db "Невірний номер",0
Error2 db "Недійсний e-mail",0
Error3 db "Невірно записано",0
rVar db "Підходить",0
Replace db "Замінено",0
Expression1 db "^(\+?\d+)?\s*(\(\d+\))?[\s-]*([\d-]*)$",0;"^[0-9]{2}0[0-9]{9}$",0
Expression2 db "^([a-z0-9]+)(\.[a-z0-9]+)*@([a-z0-9]+)(\.[a-z0-9]+)+$",0;"^[A-F0-9a-f]@[a-f].[a-f]$",0
Expression3 db "^(\d){1,8}\.(\d){1,8}",0
DlgName db "MyDialog",0
App db "ProgID_CLSID",0
ms1 db "Enter CLSID here",0
ms2 db "Enter ProgID here",0
ms3 db "There is no ProgID for this CLSID",0
ms4 db "There is no CLSID for this ProgID",0
Err1 db "The wrong CLSID",0
;VBScript.RegExp
GUID_RegExp db 0A4h, 0ACh, 04Dh, 03Fh, 00Dh, 016h, 0D2h, 011h, \
0A8h, 0E9h, 000h, 010h, 04Bh, 036h, 05Ch, 09Fh
;IUnknown
GUID_I db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, \
0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
.data?
ResBuffer db 512 dup(?)
DataBuffer db 512 dup(?)
buf1 db 512 dup(?)
Exp1U dw 256 dup(?)
Exp2U dw 256 dup(?)
Exp3U dw 256 dup(?)
buff db 256 dup(?)
hEdit1 DWORD ?
hEdit2 DWORD ?
buf db 256 dup(?)
wbuf db 512 dup(?)
cls db 16 dup(?)
bufaddr DWORD ?
hInstance dd ?
.code
;Set RegExp = New RegExp(GUID_RegExp, *_MULTI_QI)
CreateInterface proc
invoke CoInitialize,0
push offset GUID_I
pop IUnknown.pIID
invoke CoCreateInstanceEx, offset GUID_RegExp, 0, 5, 0, 1, offset IUnknown
ret
CreateInterface endp
;RegExp.Release(Interface)
ReleaseInterface proc uses ecx
mov eax,IUnknown.pItf
push eax
mov ecx,[eax]
call dword ptr[ecx+8]
invoke CoUninitialize
ret
ReleaseInterface endp
;RegExp.Addref(Interface)
AddRef proc uses esi
mov esi,IUnknown.pItf
push esi
mov eax,[esi]
call dword ptr[eax+4]
ret
AddRef endp
;RegExp.Method = Bool
RegExp_Method proc Method:DWORD,Bool:DWORD
mov eax,IUnknown.pItf
push Bool
push eax
mov ecx,[eax]
mov edx,Method
call dword ptr[ecx+edx]
ret
RegExp_Method endp
;RegExp.Pattern = Expression
RegExp_Pattern proc Expression:DWORD,lpWideCharStr:DWORD,cchWideChar:DWORD
local pBSTR:DWORD
invoke lstrlen, Expression
invoke MultiByteToWideChar, CP_ACP, 0, Expression, eax, lpWideCharStr, cchWideChar
invoke SysAllocStringLen, lpWideCharStr, eax
mov pBSTR,eax
push eax
mov eax,IUnknown.pItf
push eax
mov ecx,[eax]
call dword ptr[ecx+20h]
invoke SysFreeString, pBSTR
ret
RegExp_Pattern endp
;RegExp.Replace(SourceString, ReplaceVar)
RegExp_Replace proc lpData:DWORD,lpWideCharStr:DWORD,cchWideChar:DWORD, \
ReplaceVar:DWORD, ResultLPSTR:DWORD, szResultLPSTR:DWORD
local ReplaceStr:DWORD
local bReplaceStr:DWORD
local szReplaceVar:DWORD
local szWReplaceVar:DWORD
;#######Convert ReplaceVar to BSTR string format#######
invoke lstrlen,ReplaceVar
mov szReplaceVar,eax
imul eax,2
inc eax
mov szWReplaceVar,eax
invoke VirtualAlloc, 0, szWReplaceVar, MEM_COMMIT, PAGE_READWRITE
mov ReplaceStr,eax
invoke MultiByteToWideChar, CP_ACP, 0, ReplaceVar, szReplaceVar, ReplaceStr, szWReplaceVar
invoke SysAllocStringLen, ReplaceStr, eax
mov bReplaceStr,eax
invoke VirtualFree, ReplaceStr, szWReplaceVar, MEM_DECOMMIT
;#######################################################
invoke lstrlen, lpData
invoke MultiByteToWideChar, CP_ACP, 0, lpData, eax, lpWideCharStr, cchWideChar
invoke SysAllocStringLen, lpWideCharStr, eax
push ResultLPSTR
push 0
push bReplaceStr
push 0
push 8
push eax
mov eax,IUnknown.pItf
push eax
mov ecx,[eax]
call dword ptr[ecx+44h]
invoke SysFreeString, bReplaceStr
mov eax,[ResultLPSTR]
mov eax,[eax]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, ResultLPSTR, szResultLPSTR, 0, 0
; invoke MessageBox,0,ResultLPSTR,0,MB_OK
ret
RegExp_Replace endpВисновки: Отримав поняття про COM як технологію, її структуру і основні методи роботи з нею. Освоїв прийоми роботи з COM-інтерфейсами, а також стандартні API функції для роботи з COM. COM є кросплатформенною технологією, яка безумовно надає певні зручності програмісту. Наприклад можливість використання одного і того самого COM-об’єкту в кількох програмах одночасно. Один з основних на мою думку недоліків, є складність технології, а також необхідність реєстрації об’єктів в реєстр робочої машини (ПК).