Ағын 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) буфер өлшемін символ түрінде анықтайды.
Экспорттелетін идентификаторды анық қосу
Ағын экспорттелетін идентификатордың адресін анық іске қосылатын DLL GetProcAddress шақыруынан алады:
FARPROC GetProcAddress( HINSTANCE hinstDll, PCSTR pszSymbolName);
Достарыңызбен бөлісу: |