Егер айнымалының алдында қызметтің прототипі болып немесе С++ класымен модификатор -_declspec(dllexport), компилятор Microsoft C/C++ соңғы obj файлға қосымша ақпарат кіргізеді. Ол obj файлдардан DLL жинағын жинағанда керек болады. Мұндай ақпаратты көріп компоновщик DLL-дан экспортталатын идентификатор тізімімен LIB файлын жасайды. Бұл LIB файлы әрбір EXE модулін жинаған сияқты идентификаторларға сүйенеді. Компоновщик сонымен қатар соңғы DLL файл таблицасына экспортқа шығатын идентификаторларды- экпорт өлімі онда экпортталатын идентификаторлар қызметінің, айнымалылары мен кластар тізімі сақталады. Сол жерге DLL модулінің әрбір идентификаторы виртуалды мекен-жайын сыйдырады(relative virtual address, RVA).
EXE модулін құру
Міне EXE модулінің шығатын кодасының мысалы:
// Модуль: MyExeFilel.cpp #include
//Мәліметтер құрылымын, идентификаторларды, кызметтерді және айнымалыларды экспорттауды косамыз
#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 идентификаторларының реті берілген).
Достарыңызбен бөлісу: |