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-ды шақыруға болмайды, бұл өзара бұғатталуға алып келеді.
Достарыңызбен бөлісу: |