
- •Мустафина б.М., Сейдахметова г.Е., Әлібиева ж.М.
- •Пәндік оқу - әдістемелік кешені
- •Алматы 2012
- •1. Пәннің оқу бағдарламасы – syllabus
- •Оқытушылар туралы мәліметтер:
- •1.2 Пән туралы мәліметтер:
- •Оқу жоспарының көшірмесі
- •1.3 Пререквизиттер
- •1.6 Тапсырмалардың тізімі мен түрлері және оларды орындау кестесі
- •1.7 Әдебиеттер тізімі
- •1.8 Білімді бақылау және бағалау.
- •1 Модуль бойынша бақылау жүргізуге арналған сұрақтар (1-7 бөлімдер)
- •2 Модуль бойынша бақылау жүргізуге арналған сұрақтар:
- •1.9 Қойылатын талаптар
- •2 Негізгі таратылатын материалдар мазмұны
- •2.1 Курстың тематикалық жоспары
- •2.2 Лекциялық сабақ конспектілері
- •1.1 Windows ож құрылымы Жүйе құрылымының жалпы бейнелеуі
- •2.2. Ағындарды диспетчерлеу және жоспарлау
- •2.3 Ағынды анықтау
- •2.4 Ағындармен жұмыс істеуге арналған api функциясы
- •2.5 Ағындардың приоритеті
- •3.1 Процесстерді басқару
- •3.2 Windows операциялық жүйесіндегі процесстер мен ағындар
- •3.3 Процесстермен жұмыс істеуге арнлаған api функциялар
- •4.2 Ағындарды синхрондау объектілері
- •Мьютекстер
- •5.1 Оқиғалар
- •5.2 Бұғатталған қосымша функциялар
- •7.1. Үймелер
- •7.2 Үйме жадысын басқару
- •8.1 Файлдар мен каталогтарды басқару Файлдарды құру және ашу
- •8.2 Каталогтарды басқару
- •8.3 Файлдар мен каталогтар атрибуттарын алудың басқа әдістері
- •9.1 Файлдарды бұғаттау
- •9.2 Реестр
- •Экспорттелетін идентификаторды анық қосу
- •12.1 Стандартты құрылғылар және консольді енгізу- шығару
- •12.2 Асинхронды енгізу- шығару және аяқталу порттары
- •2.3 Лабораториялық сабақтардың жоспары
- •2.4 Оқытушының басқаруымен студенттің өзіндік жұмысы бойынша оқу жоспары (соөж) (45 сағат)
- •2.5 Студенттің өзіндік жұмысының сабақ жоспары (сөж) (45 сағат)
- •2.6 Өзін өзі тексеру үшін кілтпен көрсетілген тестік жаттығулар
- •2.7 Курс бойынша емтихан сұрақтары
- •Глоссарий
- •Жүйелік программалау
9.2 Реестр
Реестр- бұл қосымша конфигурацияларының және жүйенің иерархиялық мәліметтерінің базасы. Реестрге қатынас- реестр бөлімдері арқылы жүзеге асады. Олар файлдық жүйенің каталогтарына аналогты. Бөлім өзге бөлімдерді немесе файл атына не мазмұнына сәйкестендіретін «параметр- мәнді» сақтауы мүмкін.
Қолданушы немесе администратор реестрдің құрамын реестр түзушісі арқылы қарай немесе түзей алады. Ол REGEDIT32 командасымен шақырылады. Бұдан басқа программалар реестрді осы бөлімде сипаттайтын API функциясы арқылы бақылай алады.
«Параметр- мән» реестрде келесі ақпаратты сипаттайды:
Версия номері және операциялық жүйенің шығарылған номері және де жүйеге енген қолданушыны;
Дұрыс орнатылған барлық қосымшалар туралы ақпараттарды;
Компьютер процесінің типі туралы ақпаратты, процессорлар санын, жүйелік жадыны, т.б.
Негізгі каталог және қосымшаны баптау тәрізді қолданушы ақпаратын;
Қауіпсіз мәліметтерді, мыс: тіркелген қолданушы аттары;
Орнатылған қызмет;
Файлдар арасындағы кеңейтілулер мен орындалатын программалардың сәйкестіктері. Олар файлдардағы белгішелерді басқанда, қолданушы интерфейсінің қабықшасы ретінде қолданады. Мыс: .doc кеңейтілуі Microsoft Word- қа сай келеді.
Жүйелік адрестер мен компьютерлер арасындағы сәйкестіктер.
Реестр бөлімдері
Файлдық жүйе каталогтары мен реестр бөлімдері арсындағы аналогияны аңғаруға болады. Әр бөлім өзге бөлімдерді және де «параметр- мән» тізбегін қамтуы мүмкін. Файлдық жүйеге файлдың толық аты бойынша қатынау сияқты, реестрге де бөлім аттары бойынша қатынауға болады. Реестрге кіру нүктесі ретінде бірнеше стандартты бөлімдер қызмет етеді.
HKEY_LOCAL_MACHINE машина туралы физикалық информацияны және де орнатылған программалық қамтама туралы мәліметтерді сақтайды. Әр орнатылған программаларға бөлімшелер түрі құрылады.
SOFTWARE\компания аты\өнім аты\Версия.
HKEY_USERS қоданушылар туралы конфигурацияларын сақтайды.
HKEY_CURRENT_CONFIG ағындағы баптау параметрлерін, монитор және шрифттің шешуші міндеттерін сақтайды.
HKEY_CLASSES_ROOT файл кеңейтулері және класс, қосымша арасындағы сәйкестікті анықтайтын, осы кеңейтулері бар объектілерге қатынас қабықшасы ретінде қолданылатын бөлімдерді сақтайды. Бұл бөлімдерде Microsoft (COM) объекті модель комопненттеріне арналған барлық мәліметтер жазылады..
HKEY_CURRENT_USER. Мұнда берілген қолданушының ақпараттары, айнымалы орта, принтер және қолданушыны баптау қосымшалары да қатысады.
Реестр арқылы басқару
Реестр арқылы басқару функциясы параметрлердің мәндерін қабылдай, орналастыра және де жаңа бөлімдерді, параметр-мәнді ала алады. Барлық бөлімшелерді көрсету және жаңасын алу үшін HKEY типті бөлім дескрипторы қолданылады. Мәндері нақты типті иемденеді; мүмкін типтердің бірнеше түрі бар, мысалы қатарлар, екілік сөздер (DWORD) және параметрлері айнымалы ортамен алмастырылатын кеңейтілетін қатар.
Бөлімдерді басқару
RegOpenKeyEx функциясы бөлімшелерді ашады. Стандарты резервтелген бөлімдердің біреуінен басталып, барлық реестрді айналып шығуға болады және де кез келген керек бөлімше дескрипторын алуға болады.
LONG RegOpenKeyEx { HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Параметрлер
hKey берілген уақыттағы ашық бөлімнің дескрипторын немесе стандарты резервтелген бөлімнің біреуін идентификациялайды;
phkResult hkey типті айнымалыны көрсетеді, ол ашық бөлімнің дескрипторын қабылдайды.
lpSubKey— бөлімше аты. Ол жолды сақтайды, мыс: Microsoft\WindowsNT\CurrentVersion. NULL мәні жаңа hKey дубликат бөлімнің ашуын шақырады. ulOptions мәні нөлге тең болу керек.
samDesired — жаңа бөлімнің қауіпсіздік атрибутын сипаттайтын қатынас маскасы. Мүмкін болатын мәндері — KEY_ALL_ACCESS, KEY_WRITE, KEY_QUERY_VALUE және KEY_ENUMERATE_SUBKEYS.
Әдетте қайтарылатын мән - ERROR_SUCCESS. Кез келген басқа мән қатені көрсетеді. Ашық бөлімді жабу үшін RegCloseKey параметр функциясы қызмет етеді.
Бөлімшелердің атын алу үшін RegEnumKeyEx функциясында бөлім дескрипторын көрсетіп кету керек.
Бұдан басқа, параметр мәнді алу үшін арналған функциялар бар: RegEnumValue және RegQueryValueEx. RegSetValueEx функциясы типтелген мәндерді ашық бөлім мәндер аймағында жазады.
RegEnumKeyEx – ашық бөлім реестрінің бөлімшелерін, каталог құрамын шығаратын FirstFile және FindNextFile сияқты шығарады. Бұл функция бөлімнің атын береді, жол класын және соңғы өзгерту уақытын береді.
LONG RegEnumKeyEx ( HKEY hKey, DWORD dwIndex,
LPTSTR lpMame, LPDWORD lpcbName, LPDWORD lpReserved,
LPTSTR lpClass, LPDWORD lpcbClass,
PFILETIME lpftLastWriteTime)
dwIndex параметрі алғашқы шақыруында нөлге тең болу керек., ал келесі шақыруларында 1-ге сіп тұру керек. Бөлім аты және өлшемі, класс қатары және өлшемі қарапайым діспен қайтарылады. Функция ERROR_SUCCESS-ті немесе қателік мәнін қайтарады.
Бұдан басқа жаңа бөлімдер құруға болады. Ол үшін RegCreateKeyEx функциясы арналған. Бөлімдерге каталог және файлдардағыдай қауіпсздік атрибутын мекшіктеуге болады.
LONG RegCreateKeyEx ( HKEY hKey, LPCTSTR lpSubKey,
DWORD Reserved, LPTSTR lpClass, DWORD dwOptions,
REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition)
Параметрлер
lpSubKey — hKey дескрипторымен сипатталған ашық бөлімдегі жаңа бөлімшенің аты.
lpClass — Өзі ұсынатын мағлұматтарды сипатайтын бөлімнің классы немесе тип объектісі. Жеке жағдайдағы мүмкін мәндері REG_SZ (нөлмен бітетін қатар) және REG_DWORD (екілік сөз).
dwOptions — нөл немесе өзара ерекшеленетін мән:
REG_OPTION_VOLATILE немесе REG_OPTION_NON_VOLATILE. Тұрақты (non-volatile) реестр ақпараты файлда сақаталады және жүйені қайта бастак кезінде орнатылады. Тұрақты емес бөлімдер жадыда сақталады және қайта орнатылмайды.
samDesired — RegOpenKeyEx сияқты.
lpSecurityAttributes NULL мәнін иеленуі мүмкін немесе қауіпсіздік атрибутын көрсетеді. Мүмкін болатын қатынау құқықтары samDesired үшін көрсетілген мәннен таңдалады.
lpdwDisposition DWORD мәніне көрсетеді, мәннің ертерек бар болғандығын (REG_OPENED_EXISTING_KEY) немесе ол қайта құрылған (REG_CREATED_NEW_KEY).
Бөлімді өшіру үшін RegDeleteKey функциясы қызмет етеді. Оның екі параметрі бар — ашық бөлімді дескриптор және бөлімше аты.
Өлшемдермен басқару
Көрсетілген ашық бөлімнің өлшемдерін RegEnumValue функциясының көмегімен шығаруға болады. Өлшем индексін көрсетіп кету керек: алғашқы шақыруда – 0, келесілерде 1-ге өсіріп тұрамыз. Функция өлшем атымен оның ұзындығын шығарады. Оған қоса өлшем мәні және типі қайтарылады.
LONG RegEnumValue ( HKEY hKey, DWORD dwIndex,
LPTSTR lpValueName, LPDWORD lpcbValueName,
LPDWORD lpReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData)
Өлшемнің ағындағы мәні lpData-ға көрсететін буферге қайтарылады. Нәтиже өлшемін lpcbData-дан алуға болады.
lpType көрсететін мағлұматтар типі REG_BINARY, REG_DWORD, REG_SZ (қатар) және REG_EXPAND_SZ-пен (өлшемдермен кеңейтілген қатар, айнымалы ортамен ауыстырылады) қоса көптеген мәндерге ие бола алады. Барлық типтердің тізімін енгізілген анықтамадан алуға болады.
Функцияның қайтарылатын міні өлшемнің барлығының шығарылғанын білуге көрсетеді. Егер дұрыс өлшем табыса, онда мән ERROR_SUCCESS-ке тең.
RegQueryValueEx функциясы жоғарыда көрсетілгендей, тек мұнда индекс емес параметр аты көрсетіледі. Егер өлшем аты белгілі болса, осы функцияны қолдануға болады, кері жағдайда бөлімді RegEnumValueEx арқылы қарастырамыз.
Ашық бөлімде өошем атын орналастыру үшін RegSetValueEx функциясы қолданылады. Мұнда өлшем атын, мән типін және мәннің өзін көрсетеміз.
LONG RegSetValueEx ( HKEY hKey, LPCTSTR lpValueName,
DWORD Reserved, DWORD dwType, CONST BYTE *lpData, CONST cbData)
RegDeleteValue функциясы өлшемді өшіру үшін қолданылады.
Негізгі әдебиет: 1 [ 468 – 482 ], 2 [ 62 – 89 ]
Бақылау сұрақтары:
Файлдарды бұғаттаудың сипаттамасы.
Реестрдің сипаттамасы
Реестрмен жұмыс жасау үшін API функциялары.
Дәріс 10. Жадыда бейнеленетін файлдар
Үймеге арналған динамикалық жады көшіру файылында резервтелу керек. Жадыны басқаратын ОЖ-ның бөлігі фиизқалық жады мен көшіру файлының арасындағы беттерді орынстыруды бақылайды және оған виртуалды адрестік кеңістікті көрсетеді.
Файлдарды Win32 жадысында көрсету мүмкіндігі бар және де файлдарды да көрсете алады.
Файлдан еңгізу-шығару қажет емес.
Жадыда жасалған мәлімет структураларын келешекте басқа бағдарламада қолдану үшін файлда сақталады.Көрсеткіштерді қолданғаннан соң болу керек.
Жадыдағы жұмысқа арналған қолайлы және эффективті алгоритмдер (сұрыптау, іздеу ағаштары, жолдарды өңдеу және т.б.) Файдың өлшемі көшірме файлынан көп үкен болса да өңдей алады.
Кейбір жағдайда файлдарды өңдеу өнімділігі жоғарлайды.
Файлдағы өңдеу буферлер мен міліметтерді басқару қажет емес. Бұл жұмысты О.Ж. орындайды.
Б3рнеше үрдіс жадының бәр облысын бірге қолдана алады және виртуалды мекен- жай кеңістігін бір файлда немесе көшірме файлында көрсетеді.
Көшірме файлының кеңістігіне келтірудің қажеті жоқ.
ОЖ- нің динамикалық құрастыру кітапханаларды (DLL) және орындалу файлдарын (EXE) ісін асыру үшін жады көрсетілуін қолданады.
Файлды көрсету объектілері
Бірінші кезең – дескрипторы бар файлды көрсету объектісін құру және кейінгі үрдістің мекен- жай кеңістігін бүкіл файлда немесе оның бөлігінде көрсетеді.
Файлды көрсету объектілері атқа ие болады, сондықтан олар жадыны бөлетін басқа үрдістерге қолайлы және де көрсетілетін оъектің қорғанысы қауыпсіздік атрибуты және өлшемі бар.
HADLE CreateFile Mapping (HANDLE hFile,
LPSECURITY_ATTRIBUTES lpsa, DWORD fdwProtector,
DWORD dwmaximymSizeHigh, DWORD dwMaximymSizeLow,
LPTSTR lpszMapName)
Қайтарылатын мән: Файл көрсететің дескриптор немесе сәтсіздік жағдайында NULL.
hFile - қорғаныс жалаушасы бар ашық файл дескрипторы.
fdwProtector – параметірмен 0хFFFFFFFF мәні (INVALID_HANDLE_VALUE константасына эквивалентті) көшірме файына көрсетеді және сіз осы мәнді бөлек файда құрмай- ақ үрдіс аралық жадыны бөлуге қолданады.
LPSECURITY_ATTRIBUTES типі көрсету объектін қорғауға мүмкіндік береді. Параметрлері төменде келтірілген жалаушалар арқылы файлға қатынас жасай алады. Арнайы мақсаттар үшін қосымша жалаушалар рұқсат етілген. Мысалы: SEC_IMAGE жалаужасы орындалатын бейнені анықтайды.
PAGE_READONLY қойылған жалаушасы, программа беттерді көрсетілген жерде оқитынын және жаза алмайтынын немесе жаза алмайтынын көрсетпейді. hFile файлы GENERIC_READ құқығымен ашылу керек.
PAGE_READWRITE жалаушасы объектіге толық қатынас құра алатынын көрсетеді.
PAGE_WRITECOPY жалаушасы осы еске сақтау көрінісінде өзгерістер болған кезде, өзінің (берілген процесске) көшірмесін көшірме файлына жазатынын анықтайды. Ол шығыс файлына жазылмай құрылғыда пайдаланады. WINDOWS 2000/NT немесе WINDOWS 9x- те нәтижелері әр түрлі болады.
dwMaximymSizeHigh және dwMaximymSizeLow параметрлері объектінің көрсету көлемін анықтайды. Егер нөл көрсетсе ағындағы көлем пайдаланылады. Көшірме файлын қолданған кейде көлемін міндетті түрде белгілеп алыңыз. Егер файлдың көлемі үлкейсе, онда сондай көлем пайдалану керек немесе керек болған жағдайда қолданылатын файылдың көлемін анықтайды. Файылдың белгіленген шекарасынан артық аймақ көрсетуге болмайды. Көрсету объектісі өсе алмайды.
lpszMapName көрсету объектісінің атын көрсетеді, ол басқа процесстермен бірге объектілермен қолдануға мүмкіндік береді.
Егерде бөлінген жады қолданылмаса, онда NULL мағынасын көрсетеді.
Қате болған жағдайда: NULL қайтарылатын мәнін айтады (INVALID_HANDLE_VALUE-де емес).
Көрсетілген объектінің атын көрсетіп, көрсетілетін файлдан дикрепторын алуға болады. Атын CreateFile Mapping қызметін шақырумен алуға болады.
Файлдың көрсетілімін бөле отырып екі процессте жадыны бірге қолдана алады. Бірінші процесс файлдың көрінуін құрады, ал келесісі осы атты қолдана отырып көріністі ашады.
Егерде аталған объект болмаса, онда оны аша алмайды.
HANDLE OpenMapping (DWORD dwDesiredAccess,
BOOL blnheritHandle, LPCTSTR lpName)
Қайтарылатын мәні : сәтсіз жағдайда файлдық көрсету дискрипторы немесе NULL.
dwDesiredAccess CreateFileMapping функцияның параметрлерін қолданып тура сондай жалаушаларды қолданады.
lpName-аты CreateFile Mapping қызметімен алынған.
blnheritHandle параметрі ол дескриптордың мұражайы.
Елестеу объектілерінің процесін мекен-жай кеңістігіне елестетеді.
Келесі этап - виртуалды мекен-жайлы аймақты бөліп алу және оның елестеу объектісіне елестету.
Бағдарламашының ойынша, осындай жадылық бөлу HeapAlloc функциясына ұқсас, бірақта ірі бөлінген үшін көрсеткішті қайтарады. (немесе файлдың елестетуі).
Файлды елестету объектісі HeapAlloc қызметін үйме қолданған жағдайда сияқты болады.
LPVOIDMapVIEWOfFILE (HANDLE hMapObject, DWORD fdwAccess,
DWORD dwOffsetHigh, DWORD dwOffsetLow, SIZE_T cbMap );
Қайтарылатын мәні: Сәтсіз жағдайда блоктің бастапқы мәні немесе NULL қайтарылады.
Параметірлер
hMapObject файындың елестеу объектісін көрсетеді, CreateFileMapping немесе OpenFileMapping функцияларынан алынған. fdwAccess параметрлерінің мағынасы елестеу объектісінің құқықтарына тиісті талапқа сай болуы керек. Жалаушалардың 3 мағынасы болуы мүмкін: FILE_MAP_ACCESS ( разрядтағы «немесе» алдындағы екі жалаушалардың).
dwOffSetHigh және dwOffSetLow параметрлері бастапқы көрініс аймағын анықтайды. Алдыңғы мекен жай ретті 64К болуы тиіс. Файыл басының елестетуге арналған қызметін нөл орын ауыстыру мағынасында қолдаңыздар.
cbMap байттардың елестету аймағының мөлшерін көрсетеді. Оның нөл мағынасы MapViewOffile функция қызметін шақырғанда, файл түгелімен көрсетілуі тиіс.
MapViewOfFileEx қызметі бірдей, бастапқы мекен жайды есінде сақтауды көрсеткені болмаса. Бұл мекен жай мысалы берілген бағдарламаларға аймақтық бастапқы мекен жай массиві болуы мүмкін. Бұл қызметті дұрыс шақырғанда, WINDOWS берілген базалық мекен жайды қолдануға мүмкіндік береді. Бұл, виртуалды мекен жайды барлық процестерден алуға көмектеседі. WINDOWS 2000/NT қате жібереді, егер процесс талап етілген кеңістікті суреттесе.
Файл көрінісі осылай орындалады, бір жерде тоқталған есте сақтау HeapFree.. қызметіндей.
BOOL UnmapViewOfFile (LPVOID lpBaseAddress)
Unmap қызметі «кірлі»(өзгертілген) диск беттерін жазуға мәжбүрлейді. Әдеттегідей процесс, көрініс арқылы файлға кіру, және процесс, кіру- шығу стандартты кіру қызметін пайдаланатындар келісілген файл түрін аша алмайды. Файлдың кіру- шығуы буфферизациясыз болмайды өйткені, көрсетілген еске сақтау дер кезінде файлға жазылмайды.
Негізгі әдебиеттер: 1 [561 - 577] , 2 [145 - 158] , 3 [409 - 461]
Бақылау сұрақтары:
Жадыда бейнеленетін файлдардың қолдануының ерекшеліктері.
Файлдарды бейнелеу үшін әрекеттердің стандартты реті.
Файлдарды бейнелеудың шектеулері.
Дәріс 11. Динамикалық байланысатын кітапханалар
DLL- да Windows API-дің барлық қызметі жинақталады. Үш үлкен қажетті DLL: Kernel32.dll (жадыны, процесстерді және ағындарды басқару ), User32.dll (пайдаланушы интерфейсін қолдау, соның ішінде, хабар жіберу, терезе ашу қызметтерімен байланысты) және GDI32.dll (текст егізумен графика).
Windows-та басқа да DLL бар:
AdvAPI32.dll- объектілерді сақтау, реетрмен жұмыс істеу және оқиғаларды тіркеу.
ComDlg32.dll- стандартты сөйлесу терезелері (FileOpen және FileSave сияқты)
ComСtl32.dll- басқарудың стандартты элементтерін қолдайды.
DLL-ды келесі мүмкіншіліктерді пайдалану үшін қолдану керек.
Қосымшы қызметтерін кеңейту.
Бағдарлама жасағанда әр тілді қолдану мүмкіндігі.
Өте қарапайым проектіні басқару.
Жадыны үнемдеу.
Қорлардың бөлінуі.
Шоғырлануын жеңілдету.
Қиындықтарды шешу, әртүрлі платформалардың ерекшеліктеріне байланысты.
Ерекше мүмкіндіктердің іске асуы.
DLL және процестердің мекен- жай кеңістігі.
DLL- негізгі код модулінің жинағы әрқайсысында белгілі сан қызметі және басқа да DLL- мен қосымша шақырулардың ретінде көрсетіледі. DLL- де әдеттегідей код жоқ, ал хабарлаудың сұрыптау циклдерінің өңдеуіне және терезе ашуға арналған. Файлдар негізгі кодпен копиляцияланып және сонымен қатар компоновкаланады. EXE файлындағыдай, бірақ компоновка кезінде /DLL кілтін көрсету керек.
Қосымша (немесе басқа DLL) функциясын шақыру үшін, DLL-да сақталған файл бейнесін ең бірінші процесті шақырған кеңістікте мекен-жайды анықтап алу керек. Бұл нақты байланыс арқылы немесе нақты емес байланыс арқылы DLL-ді қосқан кезде орындалады. Енді DLL-дің барлық қызметтері бұл процестің барлық ағысына тиімді. Ағыс DLL-ден қандай да бір қызметін шақырғанда ол өзінің параметірін ағыс санымен шығарып алып, осы стекте жергілікті өзгергішті орналастырады. Сонымен қатар, барлық кодамен белгіленген объектілер шақырылған ағынға жатады немесе DLL процесі ештенеге ие олмайды.
DLL файл бейнесін жобалауда процестің мекен- жай кеңістігін жасайды және сонымен қатар процесстер глоольді статистикалық өзгерістер көшірмесін жасайды.
EXE- және DLL- модульдерінің көрінбейтін байланыстары.
Көрінбейтін байланыс (implicit linking)- бұл ең кең тараған әдіс. Орындалатын модуль (EXE) – DLL- ден айнымалыларды және қызметтерді импортқа шығарады, ал DLL- модулі орындалатын модульге экпорттайды. DLL сонымен қатар басқа DLL- дің қызметін импорттайды.
DLL модулін жасау.
DLL- айнымалыларды экпортқа , қызметтері немесе С++ кластарын басқа модульдерге шығара алады. DLL-ді шығарарда алдымен тақырыптық файл жасалады, ол DLL-дің бастапқы коды бойынша барлық модульдерге қосылады. Сонымен қатар, оны өзіңнің DLL-іңмен бірге қою керек, өйткені басқа шығарушылар да өз кодтарымен өз модульдеріне қосыла алу үшін олар біздің қызметті немесе айнымалыларды импорттайды. Бірдей тақырыптық файл, DLL- ді жинау кезінде қолданылатын және басқада орындаушы модульдер қосымшаның көмегін жеңілдетеді.
DLL MYLIBAPI берілген файлдар қосылғанда тақырыптық файл қосылғанша _declspec(dllexport) деп көрінеді. Мұндай модификатор берілген айнымалылар, қызметтер немесе С++ класы экспортталады. Сонымен қатар MyLibFile1.cpp экспортқа шығаратын айнымалы немесе қызметте MYLIBAPI идентификаиоры қойылмайтынына көңіл бөлу керек. Ол бұл жерде қажет емес: тақырыптық файлды қарап шығып айнымалыларды және қызметтерді экспортқа шығатынын компилятор есте сақтайды.
Идентификатор MYLIBAPI extern- ді қосады. Модификатор extern компиляторға қызметтер мен айнымалылардың аттарын бұрмалауға мүмкіндік бермейді және олар орындалатын модульге қолдануға болатындай С-ға жазылғандай, С++ немесе басқа да бағдарламаның басқа тілінде жазылған. Бұл модификатормен С++ кодымен ғана пайдалануға болады, бірақ мүлде стандартты С кодындай емес.
Біз тақырыптық файлдың DLL файлының ішінде қалай қолданылуын көрдік.
Берелген файлда EXE модулі MYLIBAPI-ді белгілеп керегі жоқ: тақырыптық файлды қосқан кезде, сіз осы индикаторлардың қалай – DLLSPEC(DLLIMPORT), және берілген кодты EXE модуліне еңгізген кезде ол DLL-дан айнымалылар мен қызметтердің ипортталатынын компилятор түсінеді.
Экспорт деген не
Егер айнымалының алдында қызметтің прототипі болып немесе С++ класымен модификатор -_declspec(dllexport), компилятор Microsoft C/C++ соңғы obj файлға қосымша ақпарат кіргізеді. Ол obj файлдардан DLL жинағын жинағанда керек болады. Мұндай ақпаратты көріп компоновщик DLL-дан экспортталатын идентификатор тізімімен LIB файлын жасайды. Бұл LIB файлы әрбір EXE модулін жинаған сияқты идентификаторларға сүйенеді. Компоновщик сонымен қатар соңғы DLL файл таблицасына экспортқа шығатын идентификаторларды- экпорт өлімі онда экпортталатын идентификаторлар қызметінің, айнымалылары мен кластар тізімі сақталады. Сол жерге DLL модулінің әрбір идентификаторы виртуалды мекен-жайын сыйдырады(relative virtual address, RVA).
EXE модулін құру
Міне EXE модулінің шығатын кодасының мысалы:
// Модуль: MyExeFilel.cpp
#include <windows.h>
//Мәліметтер құрылымын, идентификаторларды, кызметтерді және айнымалыларды экспорттауды косамыз
#include “MyLib\MyLib.h”
….
Int WINAPI WinMain(HINSTANCE hinstExe,HINSTANCE,LPTSTR
pszCmdLine,int){
int nLeft=10, nRight=25;
TCHAR sz[100];
Wsprintf(sz, TEXT(“%d+ %d =%d ”), nLeft, nRight, Add(nLeft, nRight));
MessageBox(NULL,sz,TEXT(“Calculation”), MB_OK);
Wsprintf(sz, TEXT(“The result from the last Add is: %d”), g_nResult);
MessageBox(NULL, sz, TEXT(“Last Result”), MB_OK);
Return (0);
}
EXE модулінің берілген кодасымен файл ашарда DLL-дің тақырыптық файлын қосу керек, өйткені импортталатын индентификаторлар белгісіз болып шығуы мүмкін. Компилятор қателер туралы көп сақтандырады.
MYLIBAPI EXE модулінің берілген файлында DLL-дің тақырыптық файлына дейін көрсетілмейді, сондықтан компиляция кезінде жоғарыда берілген кода арқылы MYLIBAPI тақырыптық файл MyLib.h мынадай болып белгіленеді - _declspec(dllimport) осындай модификаторды кездестіріп айнымалы атының, қызметтер немесе С++ класының алдында компилятор түсінеді, бұл берілген идентификатор DLL модулі арқылы импортталады.
Ары қарай барлық OBJ модульдерін EXE модуліне компоновщик жинайды. Бұл үшін ол қандай DLL-інде импортталатын идентификаторлар сақталады, олар кодада белгіленген. Ол бұл жайында LIB файлынан оған берілетін ақпаратты алады (онда экспортталатын DLL идентификаторларының реті берілген).
Импорт деген не
Идентификатор импортталғанда _declspec(dllimport) стандартына жүгінбей- ақ С тілінің extern кілттік сөзді қолдануға болады. Бірақ идентификатор белгілі болса, егер оған алдын ала LIB файлынан DLL модуліне импортталса компилятор өзіне тиімді кода шығарады.
Импортталатын идентификаторларға мүмкіндік беріп компоновщик соңғы EXE модулінде импорт бөлімін ашады(import section).
Мұнда DLL модуліне, керекті DLL сандарын пайдаланып идентификаторларға жүгінеді.
EXE модулінің орындалуы
EXE файлын қосқанда жүктеуші операция системасын оның процесіне вертуалды кеңістік және оған орындаушы модуль ойлап табады. Ары қарай жүктеуші импорт бөлімін сараптап және процесстің мекен-жай кеңістігіне DLL-ді шығарады.
Әлбетте имипорт бөлімінде DLL-дің аты ғана көрсетілген (жолсыз). Жүктеушіға өзі ізденуіне тура келеді. Дискілерден қолданушының компьютеріне DLL- де іздеу мына мөлшер бойынша іске асады:
EXE файлы бар каталог.
Процесстің ағын каталогі.
Windows системасының каталогі.
Windows-тің негізгі каталогі.
PATH айналасындағы айнымалылар көрсетілген каталог.
DLL модулін мекен-жай кеңістігіне қарап жүктегіш әрбір импорт бөліміне қарап тексереді. Егер де DLL- де импорт бөлімі болса (онда болуы да мүмкін), онда жүктеуші келесі DLL модулін шығарады. Егер де бұл қосмылуларды басқа модульдер керек етсе, онда жүктеуші қосылған DLL-дердің тізімін алады да бірақ рет шығарады.
Мекен-жай кеңістігінен процесстің керекті DLL модульдерін тауып алып жүктеуші импортталатын индикаторларды орнықтырады. Бұл процессті жүзеге асыру үшін импорт бөлімін DLL-ға келетін көрсетілген идентификаторды тексереотырып әр модульді қайта қарап шығады.
Идентификаторды тауып ала, жүктеуші оның RVA-ін виртуалды мекен-жайға қосады, ол арқылы берілген DLL процесстің мекен жай кеңістігінде орналасқан. Ол берілген мекен жайды импорт бөлімінің EXE модулінде сақтайды. Осы уақыттан бастап импортталатын идентификатор шақыратын модульдің импорт бөлімінен мекен-жайын анықтайды. Осы жолмен импортталатын айнымалыға, кызметтерге немесе С++ класының мүшелерінің кызметтеріне жол ашады. Динамикалық байланыстар орныққан кезде процесстің алғашқы ағындары орындала бастайды.
Барлық DLL-дардың жүктеушісі және жүгінуді орнықтыру біраз уақыт алады. Осы уақытты қысқарту үшін EXE және DLL модульдерінің базалық мекен жайларын модификациялап байланысын жүргізу керек.
DLL-дің анық іске қосылуы және идентификаторларды байланыстыру
Ағын DLL-модульден функцияны шақыруы үшін, осы ағын жататын процестің адрестік кеңістігіне DLL-ді енгізу(спроецировать) керек. Бұл екі жолмен жасалады:
Қосымша коды DLL құрамындағы идентификаторларға жәй тиістіледі және сонда да қосымшаны іске қосқанда керек DLL-ді енгізуші байланыстырады.
Анық іске қосу және қосымшаның орындалу кезеңінде талап ететін DLL-ді байланыстыру. Басқаша айтқанда, процестің адрестік кеңістігіне ағын DLL-ді анық іске қосады. DLL-функцияға қажет ауани (виртуальный) адресті алады және оны сол адрес бойынша шақырады. Бұл жолдың тиімділігі, барлығы орындалып жатқан қосымшада жүреді.
DLL-дің анық іске қосылуы
Кез келген уақытта ағын процестің адрестік кеңістігіне екі функцияның біреуін шақырып, DLL-ді енгізуі(спроецировать) мүмкін:
HINSTANCE LoadLibrary (PCTSTR pszDllPathName);
HINSTANCE LoadLibraryEx (PCTSTR pszDllPathName,
HANDLE hFile, DWORD dwFlags);
Екі функцияда DLL-файлдың бейнесін іздейді және процесті шақыратын адрестік кеңістікке енгізуге тырысады. Осы функциялармен қайтарылатын HINSTANCE типінің мәні, ауани жадының адресін хабарлайды, сол бойынша файл бейнесі енгізіледі. Қате болған жағдайда NULL (GetLastError-ді қарауы мүмкін) қайтарылады.
LoadLibraryEx функциясы: hFile өлшемдері келешектегі версияларда қолданылуы үшін сақтаулы(зарезервирован) және NULL болуы қажет. DwFlags өлшемдерінде 0-ді немесе DONT_RESOLVE_DLL_REFERENCES, LOAD_LIBRARY_AS _DATAFILE и LOAD_WITH_ALTERED_SEARCH_PATH жалаушалар комбинациясын беруге болады.
DLL-ді анық шығарып алу
DLL-де керектік болмаса, процестің адрестік кеңістігінен оны шығарып алу үшін келесі функцияны шақырамыз:
BOOL FreeLibrary (HINSTANCE hinstDll);
DLL–ді басқа функцияның көмегімен шығарып алуға болады:
VOID FreeLibraryAndExitThread (HINSTANCE hinstDll,
DWORD dwExitCode);
LoadLibrary және LoadLibraryEx функциялары нұсқалған кітапхананың пайдаланушы санының санағышын үлкейтеді, ал FreeLibrary және FreeLibraryAndExitThread – оны төмендетеді. Солай LoadLibrary бірінші шақыруда DLL-ді іске қосу үшін жүйе DLL-файлдың бейнесін процесті шақыратын адрестік кеңістігіне қолданылмайды және осы DLL-дің пайдаланушы санының санағышына бірлік қосылады. Егер сол процестің ағыны сол DLL үшін тағы бір рет LoadLibrary шақырса, DLL енді қолданылмайды; жүйе оның пайдаланушы санының санағышын жай үлкейтеді.
DLL-ді процестің адрестік кеңістігінен шығарып алу үшін , FreeLibrary-ді екі рет шақыруға тура келеді: бірінші шақыру санағышты 1-ге дейін төмендету, екіншісін 0-ге дейін. Санағыштың нольденгенін тапқаннан кейін, жүйе DLL-ді өшіреді.
Жүйе әрбір процесте өзінің DLL санағышын қолдайды.
DLL-дің процестің адрестік кеңістігіне енгізілгенін анықтау үшін ағын GetModuleHandle функциясын шақыруы мүмкін:
HINSTANCE GetModuleHandle(PCTSTR pszModuleName);
Мысалы, келесі код MyLib.dll-ді іске қосады, тек егер ол процестің адрестік кеңістігіне енгізілмесе:
HINSTANCE hinstDll=GetModuleHandle(“MyLib”);
if (hinstDll==NULL){
hinstDll=LoadLibrary(“MyLib”);
}
Егер DLL үшін HINSTANCE мәні бізде бар болса, GetModuleFileName көмегімен DLL немесе EXE толық атын (жолмен бірге) анықтауға болады:
DWORD GetModuleFileName( HINSTANCE hinstModule,
PTSTR pszPathName, DWORD cchPath);
Бұл функцияның бірінші өлшемі – DLL-ға (немесе EXE) керек HINSTANCE типінің мәні. Екінші өлшем, pszPathName, ол файлдың толық атын жазатын буфер адресін береді. Үшіншісі – (cchPath) буфер өлшемін символ түрінде анықтайды.