Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

Lp trnh C trn Windows

Th vin lin kt ng (DLL Dynamic Link Library)


Nguyn Tri Tun Khoa CNTT H.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn

Ni dung

Gii thiu Xy dng DLL Cch thc gi DLL trong ng dng

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

Gii thiu

Lin kt (Linking) l g ? Cc loi th vin nh ngha DLL DLL v c ch qun l b nh

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

Gii thiu - Lin kt (Linking) l g ?

Lin kt l cch thc m trnh bin dch nhng/kt hp cc on m thc thi ca nhng module th vin (Lib) vo chng trnh C 2 cch lin kt:
Lin kt tnh (Static linking) Lin kt ng (Dynamic linking)

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

Gii thiu Cc loi th vin Th vin lin kt tnh (Static linking library)
Dng file: .LIB Cha m lnh nh phn ca cc hm th vin Dng nhng vo file chng trnh khi thc hin giai on lin kt (linking) ca qu trnh bin dch Trnh bin dch s copy on m lnh ca hm th vin vo trong nhng module gi u im:
D thc hin Chng trnh c th chy c lp, khng cn cc file km theo Chng trnh s chy nhanh hn (nu kch thc nh)

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

Gii thiu Cc loi th vin(tt)

Th vin lin kt tnh (tt)


Khuyt im:
on m lnh c nhng vo file chng trnh kch thc chng trnh ln, tn b nh on m lnh c nhng vo nhiu file chng trnh khc nhau khng ti u Khi thay i hm th vin phi bin dch li ton b cc file chng trnh

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

Gii thiu Cc loi th vin(tt) Th vin lin kt ng (Dynamic linking library)


Dng file: .LIB v .DLL File .Lib:
Th vin nhp (Import library). Khng cha m lnh ca cc hm, Ch cha cc thng tin cn thit H iu hnh np th vin DLL v xc nh cc hm export trong DLL S dng khi dng cch thc load-time dynamic linking

File .DLL:
Cha m lnh nh phn ca cc hm th vin c ti vo b nh khi ng dng gi hm th vin Cn c khi thc hin ng dng

M lnh ca cc hm s khng c nhng vo trong file chng trnh ca ng dng ng dng ch cn lu thng tin ca hm th vin, v khi cn, H iu hnh s ti cc hm th vin vo b nh
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 7

Gii thiu Cc loi th vin(tt)

Th vin lin kt ng (tt)


u im:
Kch thc ca ng dng nh Nhiu ng dng c th dng chung 1 DLL, do , tit kim b nh (thng thng, cc ng dng c data ring, nhng c th chia x m lnh) Khi khng cn s dng, c th gii phng DLL khi b nh Khi cn nng cp, chch cn thay th file DLL, cc file chng trnh khc khng b nh hng

Khuyt im:
Kh s dng hn
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 8

Gii thiu - nh ngha DLL

L th vin cha cc hm v d liu c th c gi t cc module khc (module c th l 1 ng dng EXE hay l mt DLL khc) DLL c np vo b nh lc run-time v c map vo vng nh ca tin trnh gi DLL c th cha 2 loi hm th vin:
Export: c php gi t cc module khc Internal: ch c dng ni b trong DLL
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 9

Gii thiu - DLL v c ch qun l b nh

Mi tin trnh (process) s np DLL vo khng gian a ch o (virtual address space) ca chnh tin trnh H iu hnh qun l 1 bin m (Count) cho mi DLL. Bin Count c tng ln 1 khi DLL c np (bi hm LoadLibrary); v b gim i 1 khi c gii phng (bi hm FreeLibrary) Khi bin Count=0 hay process kt thc, DLL c gii phng khi b nh
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 10

Gii thiu - DLL v c ch qun l b nh(tt)

Cc hm DLL c thc thi trong ng cnh ca tiu trnh (Thread) gi hm, do :


DLL s dng Stack ca tiu trnh DLL s dng khng gian a ch o ca tin trnh gi DLL cp pht b nh cho nhng bin ng trn khng gian a ch o ca tin trnh gi

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

11

Xy dng DLL

Xy dng DLL bng th vin Win32 API Xy dng DLL bng th vin MFC

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

12

Xy dng DLL Dng th vin Win32 API

V d to lp DLL Phn tch cc khai bo Phn tch hm DllMain V d lin kt DLL vi 1 ng dng

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

13

Xy dng DLL Dng th vin Win32 API(tt)

V d to lp DLL
Chn menu File New Chn tab Projects Chn loi project Win32 Dynamic Link Library t tn project v xc nh ng dn th mc trong Location Step 1: Chn loi ng dng A DLL that exports some symbols Nhn Finish kt thc

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

14

Xy dng DLL Dng th vin Win32 API(tt)

Phn tch cc khai bo


<DLL-Name>.h
#define DLLEXPORT #define DLLIMPORT __declspec(dllexport) __declspec(dllimport)

// V d khai bo 1 bin xut khu DLLEXPORT int nDll=0; // V d khai bo 1 hm xut khu DLLEXPORT int fnDll(void);

dllexport (xut khu): cung cp hm, d liu, ti nguyn, cho cc chng trnh/DLL khc s dng
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 15

Xy dng DLL Dng th vin Win32 API(tt)

Phn tch cc khai bo (tt)


dllimport (nhp khu): l load 1 hm, hay d liu, hay ti nguyn, t 1 DLL khc s dng Mi DLL c th <App-Name>.h Import hm/d liu t cc DLL #definev s Export hm/d liu ca chnh n khc; DLLIMPORT __declspec(dllimport)
// V d khai bo 1 bin nhp khu DLLIMPORT int nDll; // V d khai bo 1 hm nhp khu DLLIMPORT int fnDll(void);

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

16

Xy dng DLL Dng th vin Win32 API(tt)

Phn tch hm DllMain


<DLL-Name>.cpp
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 17

Xy dng DLL Dng th vin Win32 API(tt)

Phn tch hm DllMain (tt)


Hm DllMain l hm u vo chnh ca DLL Hm DllMain c gi khi DLL c load vo b nh hoc khi Windows yu cu DLL kt thc (unload khi b nh) Hm DllMain c nhim v khi to hoc gii phng cc ti nguyn s dng cho DLL (nu c) Cc tham s:
hModule: handle ca DLL, do Windows to ra ul_reason_for_call: nguyn nhn hm DllMain c gi
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 18

Xy dng DLL Dng th vin Win32 API(tt) Phn tch hm DllMain (tt)
DLL_PROCESS_ATTACH:
Hm DllMain vi tham s DLL_PROCESS_ATTACH c gi khi process tin hnh load DLL Th vin DLL ang c Windows nh x vo vng nh ca tin trnh (thc hin li gi DLL). y l c hi DLL khi to cc bin, cp pht vng nh hay nhng thao tc cn thit khc trc khi cho php tin trnh gi n cc hm ca th vin

DLL_PROCESS_DETATCH:
Th vin DLL c gii phng khi vng nh ca tin trnh do 1 trong 3 nguyn nhn: np DLL khng thnh cng, tin trnh kt thc, hay tin trnh gi hm FreeLibrary y l c hi gii phng cc bin hay ti nguyn m DLL cp pht
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 19

Xy dng DLL Dng th vin Win32 API(tt) Phn tch hm DllMain (tt)
DLL_THREAD_ATTACH:
Khi tin trnh to mi 1 tiu trnh (thread), Windows gi hm DllMain ca tt c cc th vin DLL ang c s dng vi tin trnh y l c hi khi to cc bin dng cho tiu trnh Lu rng tnh hung ny ch xy ra khi tiu trnh c to sau khi th vin DLL load vo tin trnh, c ngha rng nu DLL c load bng hm LoadLibrary th tt c cc tiu trnh hin c (trong tin trnh) s khng gi hm DllMain vi tham s ny

DLL_THREAD_DETACH:
Khi 1 tiu trnh kt thc, Windows gi hm DllMain ca tt c cc th vin DLL ang c s dng vi tin trnh ny y l c hi gii phng cc bin dng cho tiu trnh
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 20

Xy dng DLL Dng th vin Win32 API(tt)

V d lin kt DLL vi 1 ng dng

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

21

Xy dng DLL Dng th vin MFC

V d to lp DLL Phn tch cc khai bo nh ngha hm export Cc dng th vin DLL ca MFC

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

22

Xy dng DLL Dng th vin MFC(tt)

V d to lp DLL
Chn menu File New Chn tab Projects Chn loi project MFC AppWizard (dll) t tn project v xc nh ng dn th mc trong Location Step 1: Chn loi ng dng Regular DLL using shared MFC DLL Nhn Finish kt thc

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

23

Xy dng DLL Dng th vin MFC(tt)

Phn tch cc khai bo


CMyDllApp: lp k tha t lp CWinApp, qun l ton b DLL
class CMyDllApp : public CWinApp { public: CMyDllApp(); DECLARE_MESSAGE_MAP() };

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

24

Xy dng DLL Dng th vin MFC(tt)

nh ngha hm export
<DLL-Name>.cpp
#define DLLEXPORT #define DLLIMPORT __declspec(dllexport) __declspec(dllimport)

// V d khai bo 1 hm xut khu DLLEXPORT int fnDll(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Cc lnh ca hm . . }

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

25

Xy dng DLL Dng th vin MFC(tt)

Cc dng th vin DLL ca MFC


C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 26

Xy dng DLL Dng th vin MFC(tt) Cc dng th vin DLL ca MFC


Regular DLL:
Ch export cc hm theo dng C-style, khng th export class, hm thnh phn ca class, cc hm nh ngha chng (overloaded function) Cc ng dng Win32 v MFC u c th dng vi loi DLL ny with MFC statically linked: DLL s c lin kt vi cc DLL chun ca MFC theo cch lin kt tnh. using shared MFC DLL: DLL s c lin kt vi cc DLL chun ca MFC theo cch lin kt ng.

MFC Extention DLL:


Cho php export cc class. ng dng khc c th to cc object t class, hoc xy dng cc lp k tha t class DLL s c lin kt vi cc DLL chun ca MFC theo cch lin kt ng. Ch c cc ng dng MFC mi c th dng vi loi DLL ny
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 27

Cch thc gi DLL trong ng dng

Cch thc tm kim file DLL Load-time Dynamic Linking Run-time Dynamic Linking

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

28

Cch thc tm kim file DLL

H iu hnh Windows s tm file DLL trong cc th mc sau:


Ni cha chng trnh ng dng gi DLL Th mc hin hnh Th mc system, system32 Th mc Windows Cc th mc c lit k trong bin mi trng PATH

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

29

Cch thc gi DLL trong ng dng Load-time ng dng s gi hm export ca DLL mt cch tng minh (ging nh cch gi hm ca th vin lin kt tnh) ng dng cn phi lin kt vi file th vin nhp (Import Lib) ca DLL ng dng s np DLL ngay thi im u tin chng trnh chy u im:
n gin, d s dng v ging nh cch dng th vin tnh

Khuyt im:
Nu khng tm ra DLL lc np, ng dng s kt thc ngay
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 30

Cch thc gi DLL trong ng dng Load-time(tt)

Cch lm:
Add file th vin nhp (DllName.lib) vo project Khai bo cc hm, bin IMPORT t DLL Gi hm ca th vin DLL nh gi hm bnh thng

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

31

Cch thc gi DLL trong ng dng Run-time

Cch lm:
ng dng s dng hm LoadLibrary hay LoadLibraryEx np DLL ti thi im cn thit Sau khi DLL c np, ng dng s dng hm GetProcAddress ly a ch ca hm export trong DLL ng dng s gi hm export trong DLL bng cch dng con tr hm tr v t hm GetProcAddress Cch ny khng cn dng n file th vin nhp (Import Lib.)
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 32

Cch thc gi DLL trong ng dng Run-time(tt)

u im:
C th x l li khng tm thy DLL, trnh kt thc ng dng tc thi, th hin thng bo li do ng dng qui nh

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

33

Cch thc gi DLL trong ng dng Run-time(tt)


V d: gi hm myFunc(LPTSTR) t th vin MYDLL.DLL
// nh ngha Prototype ca hm typedef VOID (*MYPROC)(LPTSTR); HINSTANCE hinstLib; MYPROC ProcAddr; // Np DLL v ly handle ca DLL module hinstLib = LoadLibrary(MYDLL"); // Nu load thnh cng, ly a ch ca hm myFunc // trong DLL if (hinstLib != NULL) { ProcAddr = (MYPROC) GetProcAddress(hinstLib, "myFunc"); // Nu ly c a ch hm, gi thc hin hm if (ProcAddr != NULL) (ProcAddr) (A parameter string \n"); // Gii phng th vin DLL FreeLibrary(hinstLib); }
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 34

Cm n - Hi & p

C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM

Spring 2004

35

You might also like