U E D R , A S I H C RSS

MFC/Dynamic Link Library

1. DLL?

기쑴의 C/C++ ν”„λ‘œκ·Έλž˜μ—μ„œλŠ” λΌμ΄λΈŒλŸ¬λ¦¬λΌ LIBλΌλŠ” ν™•μž₯μžλΌ κ°€μ§„ ν˜•νƒœλ‘œ μ œκ³΅ν•˜μ—¬ μ½”λ“œλΌ μ»΄νŒŒμΌν•œν›„ 링컀가 ν”„λ‘œκ·Έλž¨μ— ν•„μš”ν•œ 뢀뢄을 라이브러리 νŒŒμΌμ—μ„œ μΆ”μΆœν•΄μ„œ λ§Œλ“€μ–΄μ§„ ν”„λ‘œκ·Έλž¨μ— λΆ™μ—¬λ„£λŠ” λ°©μ‹μœΌλ‘œ λ§Œλ“€μ–΄μ‘Œλ‹€. 이런 ꡬ쑰가 μœˆλ„μš° ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ˜€λ©΄μ„œ, λ°”λ€Œμ–΄μ•Όν–ˆλŠ”λ°..
μ’…μ „μ˜ λ°©μ‹μ²˜λŸΌ μ •μ μœΌλ‘œ λ§ν¬λΌ ν•˜κ²Œλ˜λ©΄ μœˆλ„μš° ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ„±μƒ ꡉμž₯히 λ©”λͺ¨λ¦¬λΌ 많이 μ°¨μ§€ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ λ™μ‹œμ— 싀행이 λ˜λ©΄μ„œ 쓸데없이 λ™μΌν•œ μ½”λ“œμ˜μ—­μ΄ μ€‘λ³΅μ μœΌλ‘œ λ©”λͺ¨λ¦¬ κ³΅κ°„μ•ˆμ— μ°¨μ§€ν•˜κ²Œ λ˜λŠ” ν˜„μƒμ΄ λ°œμƒν•˜μ˜€λ‹€. μ—¬κΈ°μ„œ μ°©μ•ˆν•˜μ—¬ μƒκ²¨λ‚œ 것이 DLL이닀. μ΄λŠ” μ‹€μ œ ν”„λ‘œκ·Έλž¨μ˜ μˆ˜ν–‰λΆ€λΆ„μ„ ν•œκ°œλ‘œ λ‘κ³ μ„œ μ—¬λŸ¬κ°œμ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ κ·Έ 뢀뢄을 κ³΅μœ ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이닀.

2. μž‘λ™λ°©μ‹

ν™•μž₯μžκ°€ λ°˜λ“œμ‹œ DLL이어야 ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, DLL 이 μ•„λ‹Œκ²½μš°μ—λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ΄λΌ λ‘œλ“œν•˜λŠ” 뢀뢄을 λ”°λ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. .vbx .ocx같은 것은 νŠΉμ •ν•œ μ’…λ₯˜μ˜ μ»¨νŠΈλ‘€λ“€μ„ ν¬ν•¨ν•˜λŠ” DLL 듀이닀.

dependency_walker_kernel32_dll.JPG

Win32APIμ—­μ‹œλ„ DLL을 ν†΅ν•΄μ„œ κ΅¬ν˜„μ΄ λ˜μ–΄μžˆλ‹€.

Library.DLL을 3개의 ν”„λ‘œκ·Έλž¨ A,B,Cκ°€ λ™μ‹œμ— κ³΅μœ ν•œλ‹€κ³  ν•˜λ©΄ 각각의 ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ λ•Œλ§ˆλ‹€ 각 ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” DLL파일의 ν•¨μˆ˜λ‘œμ˜ 링크가 μΌμ–΄λ‚œλ‹€. 이런 과정은 μœˆλ„μš° μš΄μ˜μ²΄μ œμ— μ˜ν•΄μ„œ μžλ™μœΌλ‘œ 이루어지고, ν•œκ°œμ˜ ν”„λ‘œκ·Έλž¨μ΄λΌλ„ 싀행이 μ’…λ£Œλ˜μ§€ μ•ŠμœΌλ©΄ μœˆλ„μš°λŠ” DLL을 λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•˜μ§€ μ•Šκ³  남겨μ€λ‹€.

단점은 DLL 파일이 변경이 λ˜μ—ˆμ„λ•Œ μ˜¬λ°”λ₯Έ λ™μž‘μ„ 보μž₯ν•˜κΈ° νž˜λ“€λ‹€λŠ” 점을 λ“€ 수 μžˆλ‹€.

3. Runtime Dynamic Linking

early binding, load-time dynamic linking
ν”„λ‘œκ·Έλž¨κ³Ό DLL이 λ©”λͺ¨λ¦¬ μ•ˆμœΌλ‘œ λ‘œλ“œλ˜μžλ§ˆμž μ‚¬μš©λ˜λŠ” ν•¨μˆ˜λ“€μ— λŒ€ν•œ 링크가 μ„±λ¦½λœλ‹€.

runtime dynamic linking
ν”„λ‘œκ·Έλž¨μ΄ λ¨Όμ €μ‹€ν–‰λ˜λ° DLL은 ν”„λ‘œκ·Έλž¨μ˜ μš”μ²­μ΄ λ°œμƒν•œ μ‹œμ μ—μ„œ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλœλ‹€. κ·Έλ•Œκ°€ λ˜μ„œμ•Ό ν”„λ‘œκ·Έλž¨μ€ DLLλ‘œλΆ€ν„° ν•¨μˆ˜μ˜ μ–΄λ“œλ ˆμŠ€λΌ μ–»κ³  그것을 μ‚¬μš©ν•΄μ„œ ν•¨μˆ˜λΌ ν˜ΈμΆœν•œλ‹€.
ν”„λ‘œκ·Έλž¨μ—μ„œ ν•„μš”ν•œ λ©”λͺ¨λ¦¬μ˜ 양을 μ΅œλŒ€ν•œ μ„μ΄λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
κ΄€λ ¨ν•¨μˆ˜) LoadLibrary(), GetProcAddress(), FreeLibrary()

runtime dynmaic linking 의 μ€‘μš”ν•œ 점은, λŸ°νƒ€μž„ μƒμ—μ„œ ν•΄λ‹Ή λͺ¨λ“ˆμ„ ꡐ체할 수 μžˆλ‹€λŠ” 점이닀. winamp 의 λ‚˜ KMP 등와 같은 ν”ŒλŸ¬κ·ΈμΈμ„ μ œκ³΅ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ˜ 경우 λŒ€λΆ€λΆ„ μ΄λŸ¬ν•œ runtime-dynamic linking 방법을 μ΄μš©ν•œλ‹€.

4. DLL의 λ‚΄μš©

DLL은 ν•¨μˆ˜μ— λŒ€ν•œ μ½”λ“œλ§Œμ„ μ €μž₯λŠ”λ° κ΅­ν•œλ˜λŠ” 것이 μ•„λ‹ˆλ‹€. λΉ„νŠΈλ§΅, ν°νŠΈμ™€ 같은 λ¦¬μ†ŒμŠ€λ“€μ„ DLL μ•ˆμ— μœ„μΉ˜μ‹œν‚¬ μˆ˜λ„ μžˆλ‹€. μ˜ˆλΌ λ“€μžλ©΄ μΉ΄λ“œλ†€μ΄μ— μ‚¬μš©λ˜λŠ” Cards.dll μ—μ„œ μΉ΄λ“œλ“€μ— λŒ€ν•œ λΉ„νŠΈλ§΅ 이λΈμ§€μ™€ κ·Έ 것듀을 λ‹€λ£¨λŠ”λ° ν•„μš”ν•œ ν•¨μˆ˜λ“€μ„ ν¬ν•¨ν•˜κ³  μžˆλ‹€.

4.1. DLL Interface

DLL 에 μžˆλŠ” μš”μ†Œλ“€μ€ export 된 κ²ƒλ“€λ§Œμ„ μ ‘κ·Ό ν•  수 μžˆλ‹€. export λŠ” ν•¨μˆ˜, 클래슀, κΈ€λ‘œλ²Œ 정적 λ³€μˆ˜, λ¦¬μ†ŒμŠ€λ“€μ΄ κ°€λŠ₯ν•˜λ‹€.

4.2. DllMain() ν•¨μˆ˜

독립적 싀행은 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ mainν•¨μˆ˜μ˜ λ³€ν˜•λœ ν˜•νƒœλΌ ν¬ν•¨ν•œλ‹€. 이 κ³³μ—μ„œλŠ” dll이 μ‚¬μš©λ˜κΈ° 전에 μ΄ˆκΈ°ν™”λ˜λŠ” λ‚΄μš©λ“€μ΄ ν¬ν•¨λ˜κ²Œ λœλ‹€. DLL초기 λ‘œλ“œμ‹œ μš΄μ˜μ²΄μ œκ°€ ν˜ΈμΆœν•œλ‹€.

5. DLL 의 λ³€ν˜•

5.1. MFC ν™•μž₯ DLL

5.2. μ •μ μœΌλ‘œ 링크된 MFC DLL

5.3. λ™μ μœΌλ‘œ 링크된 MFC DLL


6. DLL μ—μ„œμ˜ λ©”λͺ¨λ¦¬

DLL μ—μ„œ λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬λΌ μƒμ„±ν•˜λŠ” 경우, ν•΄λ‹Ή DLL 을 μ΄μš©ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ νž™μ— ν•΄λ‹Ή λ©”λͺ¨λ¦¬ 곡간이 작히게 λœλ‹€. DLL 이 ν•˜λ‚˜λ§Œ μ˜¬λΌκ°„λ‹€κ³  λ©”λͺ¨λ¦¬κ°€ κ³΅μœ λ˜μ§„ μ•ŠλŠ”λ‹€.

만일 ν”„λ‘œμ„ΈμŠ€-global ν•œ λ©”λͺ¨λ¦¬λΌ μ“°κ³  μ‹Άλ‹€λ©΄, λ©”λͺ¨λ¦¬ 맡을 μ΄μš©ν•˜κ±°λ‚˜ DLL 곡유 μ˜μ—­μ„ μ„ μ–Έν•˜λŠ” 방법 등을 써야 ν•œλ‹€.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:42
Processing time 0.0270 sec