Идентификатор импортталғанда _declspec(dllimport) стандартына жүгінбей- ақ С тілінің extern кілттік сөзді қолдануға болады. Бірақ идентификатор белгілі болса, егер оған алдын ала LIB файлынан DLL модуліне импортталса компилятор өзіне тиімді кода шығарады.
Импортталатын идентификаторларға мүмкіндік беріп компоновщик соңғы EXE модулінде импорт бөлімін ашады(import section).
Мұнда DLL модуліне, керекті DLL сандарын пайдаланып идентификаторларға жүгінеді.
EXE файлын қосқанда жүктеуші операция системасын оның процесіне вертуалды кеңістік және оған орындаушы модуль ойлап табады. Ары қарай жүктеуші импорт бөлімін сараптап және процесстің мекен-жай кеңістігіне DLL-ді шығарады.
Әлбетте имипорт бөлімінде DLL-дің аты ғана көрсетілген (жолсыз). Жүктеушіға өзі ізденуіне тура келеді. Дискілерден қолданушының компьютеріне DLL- де іздеу мына мөлшер бойынша іске асады:
EXE файлы бар каталог.
Процесстің ағым каталогі.
Windows системасының каталогі.
Windows-тің негізгі каталогі.
PATH айналасындағы айнымалылар көрсетілген каталог.
DLL модулін мекен-жай кеңістігіне қарап жүктегіш әрбір импорт бөліміне қарап тексереді. Егер де DLL- де импорт бөлімі болса (онда болуы да мүмкін), онда жүктеуші келесі DLL модулін шығарады. Егер де бұл қосмылуларды басқа модульдер керек етсе, онда жүктеуші қосылған DLL-дердің тізімін алады да бірақ рет шығарады.
Мекен-жай кеңістігінен процесстің керекті DLL модульдерін тауып алып жүктеуші импортталатын индикаторларды орнықтырады. Бұл процессті жүзеге асыру үшін импорт бөлімін DLL-ға келетін көрсетілген идентификаторды тексереотырып әр модульді қайта қарап шығады.
Идентификаторды тауып ала, жүктеуші оның RVA-ін виртуалды мекен-жайға қосады, ол арқылы берілген DLL процесстің мекен жай кеңістігінде орналасқан. Ол берілген мекен жайды импорт бөлімінің EXE модулінде сақтайды. Осы уақыттан бастап импортталатын идентификатор шақыратын модульдің импорт бөлімінен мекен-жайын анықтайды. Осы жолмен импортталатын айнымалыға, кызметтерге немесе С++ класының мүшелерінің кызметтеріне жол ашады. Динамикалық байланыстар орныққан кезде процесстің алғашқы ағымдары орындала бастайды.
Барлық DLL-дардың жүктеушісі және жүгінуді орнықтыру біраз уақыт алады. Осы уақытты қысқарту үшін EXE және DLL модульдерінің базалық мекен жайларын модификациялап байланысын жүргізу керек.
Достарыңызбен бөлісу: |