Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СП_УМК 2012 каз для 5В070400.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.4 Mб
Скачать

Экспорттелетін идентификаторды анық қосу

Ағын экспорттелетін идентификатордың адресін анық іске қосылатын DLL GetProcAddress шақыруынан алады:

FARPROC GetProcAddress ( HINSTANCE hinstDll,

PCSTR pszSymbolName);

HinstDll өлшемі – қажетті идентификаторды сақтайтын, LoadLibrary немесе GetModuleHandle-ге қайтарылған және DLL-ге қатысты сипаттаушы.

РszSumbolName өлшемін екі түрлі формада нұсқауға рұқсат беріледі.

Біріншіден, соңында нольдік символ жолдың адресі ретінде бізді қызықтыратын функция аты болуы керек:

FARPROC pfn = GetProcAddress ( hinstDll, ”SomeFuncInDll”);

PCSTR типі GetProcAddress функциясы тек ANSI жолды қабылдайтынын нұсқайды. DLL экспорт бөлімінде функция және айнымалы идентификаторлары әрқашан ASCII-жол ретінде сақталады.

РszSumbolName өлшемінің екінші формасы керек функцияның реттік номерін нұсқауға рұқсат береді:

FARPROC pfn = GetProcAddress ( hinstDll, MAKEINTRESOURSE(2));

Мұнда бізге ізделінді идентификатордың (2) реттік номері белгілі екені көрсетіледі. Microsoft реттік номерлерді қолдануға кеңес бермейді.

Енгізу/шығару функциялары

DLL-де бір ғана енгізу/шығару функциясы болуы мүмкін. Жүйе оны ақпараттық нысанада(цель) шақырады, ол әдетте DLL-де нақты процесс пен ағындағы ресурстарды тазалау үшін және инициализациялау қолданылады. Егер сіздің DLL-ге мұндай ескертулер (уведомления) керек болмаса, онда бұл функцияны қолданбай-ақ қоюға болады.

Функцияны қолдану мысалы:

BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason,

PVOID fImpLoad)

{

switch (fwReason){

case DLL_PROCESS_ATTACH:

//DLL процестің адрестік кеңістігіне шығарылады

break;

case DLL_THREAD_ATTACH:

//ағын құрастырылады

break;

case DLL_THREAD_DETACH:

//ағын анық аяқталады

break;

case DLL_PROCESS_DETACH:

//DLL процестің адрестік кеңістігінен өшіріледі

break;

}

return(TRUE);

//тек DLL_PROCESS_ATTACH үшін қолданылады

HinstDll өлшемі – DLL көшірмесінің бейнелеуіші. (процестің адрестік кеңістігіне DLL файл проекциясының ауани адресі)

FImpLoad өлшемі – 0-ден өзгеше, егер DLL-дің іске қосылғаны анық емес болса және 0-ге тең, егер DLL-дің іске қосылғаны анық болса.

FdwReason өлшемі – жүйенің осы функцияны шақыру себебін хабарлайды. Ол DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH мәндерінің біреуін қабылдайды.

Platform құжаттарында SDK расталады, DllMain инициализацияның тек жай түрін орындау қажет – ағынның тораптық жадысын дұрыстайды, файлдардың ашылуы және т.б.

DllMain функциясынан LoadLibrary(Ex) және FreeLibrary-ды шақыруға болмайды, бұл өзара бұғатталуға алып келеді.

Негізгі әдебиеттер: 1 [578 - 593] , 2 [158 - 166] , 3 [475-526]

Бақылау сұрақтары:

  1. DLL модулі қалай құрылады?

  2. Экспорт және импорт бөлімдері не үшін қолданылады?

  3. EXE модулі қалай құрылады, DLL-ден импорттелетін идентификаторлар?

Дәріс 12. Енгізу- шығаруды қолдану

12.1 Стандартты құрылғылар және консольді енгізу- шығару

Win32 енгізу, шығару және қате туралы хабарлама үшін үш стандартты құрылғысы бар. Стандартты құрылғылар дескрипторлары алу үшін арнайы функция бар.

HANDLE GetStdHandle (DWORD nStdHandle)

Қайтарылатын мән: жіберілетін дескриптор егер функция сәтті аяқталса; болмаса INVALID_HANDLE_VALUE.

GetStdHandle nStdHandle өлшемі мына мәндердің біреуін иемденуі керек:

  • STD_INPUT_HANDLE;

  • STD_OUTPUT_HANDLE;

  • STD_ERROR_HANDLE.

Стандартты құрылғылар әдетте пернетақтаға арналған. Стандартты енгізу- шығаруды қайта бағыттауға болады.

GetStdHandle стандартты құрылғылардың дескрипторын құрмайды және бұрынғысын көшірмейді. Бір өлшемді тізбектелген шақырулар дескриптордың сол бір мәнін қайтарады. Стандартты құрылғының дескрипторын жабу бұл құрылғыны келесі қолдануға қатынассыз қалдырады. Сондықтан программалар мысалын стандартты құрылғыларды ашады, жұмыс жасайды, бірақ жаппайды.

BOOL SetStdHandle (DWORD nStdHandle, HANDLE hHandle)

Қайтаратын мәні: TRUE немесе FALSE, сәттілік немесе сәтсіздігіне байланысты.

SetStdHandle өлшемі. nStdHandle – дің мүмкіндіктері GetStdHandle- дағыдай. hHandle стандартты құрылғы болуы керек өлшемі ашық файлды анықтайды.

Әдетте стандартты енгізу- шығаруды үрдіс аумағында қайта бағыттау үшін SetStdHandle және GetStdHandle әдісі қолданылады. Нәтижеде алынған дескриптор келесі енгізу- шығару операцияларында қолданылады.

Файлдардың екі аты консольді (пернетақтадан) енгізу және консольді шығару үшін резервтелген: CONINS және CONOUTS. Консолдістандартты құрылғылардың кез келген бағытынан қолдануға болады; ол үшін тек CreateFile арқылы CONINS немесе CONOUTS дескрипторларын ашу керек.

Консольді енгізу- шығару үшін ReadFile және WriteFile- ді қолдануға болады, бірақ арнаулы ReadConsole және WriteConsole функцияларын қолданған абзал. Олардың негізгі қасиеттері бұл функциялар байттарды емес, универсалды таңбаларды (TCHAR) өңдейді және де SetConsoleMode функциясымен орнатылған консол режимін аңғарады.

BOOL SetConsoleMode ( HANDLE hConsole, DWORD fdevMode)

Қайтаратын мәні: егер функция сәтті аяқталса, TRUE.

SetConsoleMode өлшемі.

nConsole енгізу буферін немесе экранды идентификациялайды, GENERIC_WRITE қатынау атрибутына ие.

fdevMode символдарды өңдеудің режимін анықтайды. Әрбір жалаушаның мәні осы жалаушаның консольді екнгізу немесе шығаруда қолданатындығын көрсетеді. Буферді құруда ENABLE_WINDOW_INPUT- тан басқа барлық жалаушалар құрылған.

  • ENABLE_LINE_INPUT каретканы қайтару символы кездескенде, оқу функциясы (ReadConsole) аяқталады.

  • ENABLE_ECHO_INPUT оқылатын символдар экран беріне көшіріледі.

  • ENABLE_PROCESSED_INPUT символдардың қайтарылуын (backspace), каретканың қайтарылуын және қатарды ауыстыруды өңдейтін жүйе.

  • ENABLE_ PROCESSED _OUTPUT символдардың қайтарылуын (backspace), табуляцияны, дыбыстық сигналды, каретканың қайтарылуын және қатарды ауыстыруды өңдейтін жүйе.

  • ENABLE_WRAP_AT_EOL_OUTPUT қарапайым және көшірілген шығарудағыдай қатарды ауыстыруға рұқсат.

Егер SetConsoleMode функциясы сәтсіз өтсе, режим өзгерілмей FALSE мәні қайтарылады. Әдетте қателік кодын GetLastError қайтарады.

ReadConsole және WriteConsole функциялары ReadFile және WriteFile тәрізді.

BOOL ReadConsole (HANDLE hConsoleInput, LPVOID lpvBuffer,

DWORD cchToRead, LPDWORD lpcchRead,

LPVOID lpvReserved)

Қайтаратын мән: егер функция сәтті аяқталса,TRUE.

Функция өлшемдері ReadFile- дағыдай. Екі өлшем байттармен емес, универсалды символдармен беріледі, ал lpvReserved NULL мәніне ие болуы керек.

Үрдіс тек бір ғана консольге ие. Консоль көп жағдайда керек болуы мүмкін, мысалға сетверді құрғанда немесе GUI қосымшасында. Ол үшін екі қарапайым өлшемсіз функция қолданылады.

BOOL FreeConsole (VOID)

BOOL AllocConsole (VOID)

FreeConsole үрдісті консольден бөледі. AllocConsole стандартты енгізу, шығару және қате үрдісті шығарумен байланысты жаңа консольді құрады. Егер үрдіске ие болып қойған болса, AllocConsole сәтсіз аяқталады. Одан аулақ болу үшін бұл функция алдына FreeConsole шақыруын орналастырыңыз.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]