DLL


¶óÀ̺귯¸®

¶óÀ̺귯¸®·Î µÎ°¡Áö Á¾·ù°¡ ÀÖ´Ù. Á¤Àû ¸µÅ©(Static Link)¿Í µ¿Àû ¸µÅ©(Dynamic Link)·Î µÎ°¡Áö ·Î ³ª´¶´Ù.
Á¤Àû ¸µÅ©´Â ÄÄÆÄÀϽà ¶óÀ̺귯¸®ÀÇ Äڵ带 ½ÇÇà ÆÄÀÏ¿¡ º¹»çÇÏ°í µ¿Àû ¸µÅ©´Â ½ÇÇà Áß¿¡ ¶óÀ̺귯¸®¿¡ ÀÖ´Â ÇÔ¼ö¸¦ È£Ãâ ÇÏ´Â ¹æ¹ýÀÌ´Ù.

DLL

DLLÀº µ¿Àû ¸µÅ©¸¦ »ç¿ëÇÏ¿© ½ÇÇà½Ã¿¡ ÇÔ¼ö°¡ Á¤ÇØÁø´Ù.
»ç¿ë Ä«¿îÆ®(usage count)¶ó´Â °ÍÀ» ÅëÇØ »ç¿ë½Ã¿¡ Ä«¿îÆ®°¡ Áõ°¡Çϰí Á¾·á½Ã¿¡ Ä«¿îÆ®°¡ °¨¼ÒµÈ´Ù.
»ç¿ëµÈ DLLÆÄÀÏÀ» ãÀ»¶§ ¸ÕÀú
1. Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÇ µð·ºÅ丮
2. ÇÁ·Î±×·¥ÀÇ ÇöÀç µð·ºÅ丮
3. À©µµ¿ìÁîÀÇ ½Ã½ºÅÛ µð·ºÅ丮
4. ¿øµµ¿ìÁî ½Ã½ºÅÛ µð·ºÅ丮
5. PATH ȯ°æ º¯¼ö°¡ ÁöÁ¤ÇÏ´Â ¸ðµç µð·ºÅ丮
¼ø¼­·Î ã´Â´Ù.

DLL(µ¿Àû ¸µÅ©)ÀÇ ÀåÁ¡

¼±¾ð

__declspec (extended-attribute) declarator 
ÇÔ¼ö¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÏ´Â ¼±¾ð¹® 
extended-attribute 
thread           TLS(thread local storage)µ¥ÀÌÅÍ·Î ÁöÁ¤ ÇÑ´Ù. ÀÌ ÁöÁ¤ÀÚ°¡ ºÙÀº º¯¼ö´Â ÇØ´ç ½º·¹µå¿¡¼­¸¸ »ç¿ë °¡´ÉÇÏ´Ù. 
naked            Á¢µÎ(prolog), Á¢¹Ì(epilog)¸¦ »ý¼º ½ÃŰÁö ¾Ê´Â´Ù. ¾î¼Àºí¸® ¾ð¾î¸¦ »ç¿ëÇÏ¿© Á÷Á¢ Á¢µÎ, Á¢¹Ì¸¦ ´Þ°íÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù. 
                       °¡»ó µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇÒ¶§ ÀÌ ±â¾ï ºÎ·ù¸¦ »ç¿ëÇÑ´Ù. ÇÔ¼ö¿¡¸¸ Àû¿ëµÇ¸ç º¯¼ö¿¡´Â Àû¿ë µÇÁö ¾Ê´Â´Ù. 
dllimport        DLL¿¡ ÀÖ´Â µ¥ÀÌÅÍ, ¿ÀºêÁ§Æ®, ÇÔ¼ö¸¦ ÀÓÆ÷Æ® ÇÑ´Ù. DLL¿¡ ÀÖ´Â ÀÌ·¸°Ô »ý±ä ÇÔ¼ö¸¦ ¾ÕÀ¸·Î »ç¿ëÇϰڴٴ ¼±¾ðÀÌ´Ù. 
dllexport        DLL¿¡ ÀÖ´Â µ¥ÀÌÅÍ, ¿ÀºêÁ§Æ®, ÇÔ¼ö¸¦ ¿¢½ºÆ÷Æ® ÇÑ´Ù. DLLÀ» »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®(½ÇÇàÆÄÀÏÀ̰ųª ¶Ç´Â DLL)¿¡°Ô DLLÀÇ Á¤º¸ 
                       ¸¦ ¸í½ÃÀûÀ¸·Î Á¦°øÇÏ´Â ¿ªÈ°À» ÇÑ´Ù.  
extern "C" 
C++ÀÇ ¾ð¾îÀÇ Æ¯¼º»ó ¿À¹ö·Îµå¿Í °°Àº °æ¿ì ´Ù¸¥ ¾ð¾î¿¡´Â ¾ø´Â Ư¼ºÀÌ´Ù. ÀÌ¿Í °°Àº C++ÀÌ °ø°³ÇÏ´Â ÇÔ¼ö Á¤º¸¸¦ mangled nameÀ̶ó°í Çϴµ¥ 
À§ÀÇ ¼±¾ðÀº mangled nameÀ» »ç¿ëÇÏÁö ¾Ê¾Æ ´Ù¸¥ ¾ð¾î¿¡¼­µµ »ç¿ëÇÏ°Ô Çϰڴٴ ¼±¾ðÀÌ´Ù.  

¿¬°á

¹¬½ÃÀû ¿¬°á

¹¬ÁöÀû ¿¬°áÀº ÇÔ¼ö°¡ ¾î´À DLLÆÄÀÏ¿¡ ÀÖ´ÂÁö ¾Ë¸®Áö ¾Ê°í »ç¿ëµÈ´Ù. ÇÁ·ÎÁ§Æ®¿¡ ÀÓÆ÷Æ® ¶óÀ̺귯¸®¸¦ Æ÷ÇÔÇØ ÁÖ¾î¾ß Çϸç À©µµ¿ìÁî´Â
ÀÓÆ÷Æ®¶óÀ̺귯¸®ÀÇ Á¤º¸¸¦ ÂüÁ¶ÇÏ¿© ¾Ë¾Æ¼­ DLLÀ» ·ÎµåµÇ¾î ÀÖÀ¸¸é »ç¿ëÄ«¿îÆ®¸¦ Áõ°¡½ÃŰ´Â ¹æ½ÄÀ¸·Î Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§
DLLÀÌ ·ÎµåµÇ¹Ç·Î ½ÇÇà½Ã ¿¬°á(Load time Linking)À̶ó°í ÇÑ´Ù.

¸í½ÃÀû ¿¬°á

¾î´À DLL¿¡ ÀÖ´Â ÇÔ¼öÀÎÁö¸¦ ¹àÈ÷°í »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ DLLÀ» ·ÎµåÇÏ´Â°Ô ¾Æ´Ï¶ó DLLÀ» ·ÎµåÇØ¾ßÇÒ ¸í·ÉÀÌ
ÀÖÀ»¶§ ·ÎµåµÈ´Ù. ÇÊ¿äÇÒ ¶§ ¼±ÅÃÀûÀ¸·Î DLLÀ» ·ÎµåÇϹǷΠ»óȲ¿¡ µû¸¥ ¸®¼Ò½º ±³Ã¼°¡ °¡´ÉÇÏ´Ù. DLLÀÇ À̸§À» ¹àÈ÷°í »ç¿ëÇϹǷΠÀÓÆ÷Æ®
¶óÀ̺귯¸®´Â ºÒÇÊ¿äÇÏ´Ù. Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ DLLÀÌ ¸Þ¸ð¸®·Î ÀÐÇôÁö¹Ç·Î ½ÇÇàÁß ¿¬°á(Run time Linking)À̶ó°í ÇÑ´Ù.
HINSTANCE LoadLibrary(LPCTSTR lpLibFileName); 
»ç¿ëÇϰíÀÚ ÇÏ´Â DLLÀ» ¸Þ¸ð¸®¿¡ Àоî¿Í ÇöÀç ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ¿µ¿ª¿¡ DLLÀ» ¸ÅÇνÃÄÑ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖµÇ ÀÌ¹Ì ¸Þ¸ð¸®¿¡ ¿Ã¶ó¿Í ÀÖ´Â 
»óŶó¸é »ç¿ë Ä«¿îÆ®¸¸ Áõ°¡ ½ÃŲ´Ù. Àμö·Î´Â ÀаíÀÚ ÇÏ´Â Àμö¸¦ ³Ö¾îÁØ´Ù. °æ·Î¸¦ ³Ö¾îÁÖÁö ¾Ê´Â ÆíÀÌ ¹Ù¶÷Á÷Çϰí È®ÀåÀÚ¸¦ »ý·«Çϸé 
µðÆúÆ®·Î .DLLÀ» »ç¿ëÇÑ´Ù. 
 
FARPROC GetProcAddress( 
     HMODULE hModule,      // DLL ¸ðµâ ÇÚµé 
     LPCSTR lpProcName     // ÇÔ¼ö À̸§À̰ųª ÇÔ¼öÀÇ ¼ø¼­°ª(ordinal value)ÀÌ´Ù. 
); 
DLL¿¡¼­ ¿¢½ºÆ÷Æ®ÇÑ ÇÔ¼öÀÇ ¹øÁö¸¦ ã¾Æ ±× ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇØ ÁØ´Ù. ÇÚµéÀÌ ¹«È¿Çϰųª ¿¡·¯ ¹ß»ý½Ã NULLÀ» ¸®ÅÏÇÑ´Ù. 
 
BOOL FreeLibrary(HMODULE hLibModule);     // DLL ¸ðµâ ÇÚµé 
DLLÀÇ »ç¿ë Ä«¿îÆ®¸¦ °¨¼Ò ½ÃŲ´Ù. Ä«¿îÆ®°¡ 0ÀÌ µÇ¸é ¸Þ¸ð¸®¿¡¼­ DLLÀ» »èÁ¦ÇÑ´Ù. ¿¡·¯ ¹ß»ý½Ã´Â FALSE¸¦ ¹ÝȯÇÑ´Ù. 

DLL°ü·Ã ÇÔ¼ö

BOOL WINAPI DllMain( 
     HINSTANCE hInst,      // DLL ¸ðµâ ÇÚµé 
     DWORD fdwReason,      // ÀÌ ÇÔ¼öÀÇ È£Ãâ ÀÌÀ¯ 
     LPVOID lpRes          // ¿¹¾à°ª. NULLÀ» ³Ö¾îÁÜ. 
); 
DLLÆÄÀÏÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¶ó ÇÒ ¼ö ÀÖ´Ù. ¿øÄ¢ÀûÀ¸·Î´Â DLL¿¡µµ ¹Ýµå½Ã ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ °¡Á®¾ßÇÑ´Ù. ´Ü C ·±Å¸ÀÓ ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÒ ¶§´Â 
C ·±Å¸ÀÓÀÌ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ´ë½Å Á¦°øÇØ ÁֹǷΠ¾ø¾îµµ »ó°ü¾ø´Ù. DLLÀÌ ´Ü¼øÇÑ ÇÔ¼öÀÇ ÁýÇÕÀ̶ó¸é DllMainÀ» ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ »ó°ü ¾ø´Ù. 
 
fdwReason 
DLL_PROCESS_ATTACH     DLLÀÌ ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£¿¡ ¸ÊÇ뵃 ¶§ È£ÃâµÈ´Ù. ¹¬½ÃÀû È£ÃâÀ϶§ ÇÁ·Î¼¼½º ½ÃÀÛµÉ ¶§, ¸í½ÃÀû È£ÃâÀ϶§  
                             LoadLibrary°¡ ¸®ÅϵDZâ Àü¿¡ ÀÌ °ª°ú ÇÔ²² DllMainÀÌ È£ÃâµÉ °ÍÀÌ´Ù. ÁÖ·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰųª ½Ã½ºÅÛ Àü¿ª 
                             ÇÚµéÀ» ÃʱâÈ­ ÇÏ´Â ¿ë·Îµµ »ç¿ëµÈ´Ù. 
DLL_PROCESS_DETACH     DLLÀÌ ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£¿¡¼­ ºÐ¸®µÉ ¶§ È£ÃâµÈ´Ù. ¹¬½ÃÀû È£ÃâÀÏ °æ¿ì ÇÁ·Î¼¼½º Á¾·áµÉ¶§, ¸í½ÃÀû È£ÃâÀ϶§ 
                             FreeLibraryÇÔ¼ö¿¡ ÀÇÇØ ÀÌ °ª°ú ÇÔ²² DllMainÀÌ È£ÃâµÈ´Ù. ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϰųª ½Ã½ºÅÛ Àü¿ªÇÚµéÀ» 
                             ÆÄ±«ÇÏ´Â ¿ëµµ·Î »ç¿ëµÈ´Ù. 
DLL_THREAD_ATTACH      DLLÀ» »ç¿ëÇϴ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î¼¼½º¿¡¼­ ½º·¹µå¸¦ »ý¼ºÇÒ ¶§¸¶´Ù ÀÌ °ª°ú ÇÔ²² DllMainÇÔ¼ö°¡ È£ÃâµÈ´Ù. Dll¿¡¼­´Â 
                             ÀÌ °ªÀ» ¹Þ¾ÒÀ» ¶§ ½º·¹µåº° ÃʱâÈ­¸¦ ¼öÇàÇØ¾ß ÇÑ´Ù. ´Ü ÀÌ °ªÀº ÀÌ¹Ì Á¸ÀçÇÏ´Â ½º·¹µå¿¡ ´ëÇØ¼­´Â Àü´ÞµÇÁö  
                             ¾ÊÀ¸¸ç ½º·¹µå°¡ »õ·Î ¸¸µé¾îÁú ¶§¸¸ Àü´ÞµÈ´Ù. ¶ÇÇÑ ÃÖ»óÀ§ ½º·¹µå´Â DLL_PROCESS_ATTACH°¡ ´ë½Å Àü´ÞµÇ¹Ç·Î 
                             ÀÌ °ªÀÌ Àü´ÞµÉ Çʿ䰡 ¾ø´Ù. 
DLL_THREAD_DETACH      DLLÀ» »ç¿ëÇϴ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î¼¼½º¿¡¼­ ½º·¹µå°¡ Á¾·áµÉ ¶§ ¸¶´Ù ÀÌ °ª°ú ÇÔ²² DllMain ÇÔ¼ö°¡ È£ÃâµÈ´Ù. DLL¿¡¼­´Â 
                             ÀÌ °ª°ú ÇÔ²² DllMainÇÔ¼ö°¡ È£ÃâµÈ´Ù. DLL¿¡¼­´Â ÀÌ °ªÀ» ¹Þ¾ÒÀ» ¶§ ½º·¹µåº° Á¾·á󸮸¦ ÇÑ´Ù. 

»ùÇÃ

// Test2.h  
 
#ifdef TEST2_EXPORTS  
        #define TEST2_API __declspec(dllexport)  
#else  
        #define TEST2_API __declspec(dllimport)  
#endif  
 
// ³»º¸³½ º¯¼öÀÇ ¿¹Á¦ÀÔ´Ï´Ù.  
extern TEST2_API int nTest2;  
 
// ³»º¸³½ ÇÔ¼öÀÇ ¿¹Á¦ÀÔ´Ï´Ù.  
TEST2_API int fnTest2(void);  
 
// ³»º¸³½ Ŭ·¡½ºÀÇ ¿¹Á¦ÀÔ´Ï´Ù.  
class TEST2_API CTest2   
{  
public:  
        CTest2(void);  
};  
 

// Test2.cpp : DLL ÀÀ¿ë ÇÁ·Î±×·¥À» À§ÇØ ³»º¸³½ ÇÔ¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù.  
#define TEST2_EXPORTS 
 
#include "Test2.h"  
 
// ³»º¸³½ º¯¼öÀÇ ¿¹Á¦ÀÔ´Ï´Ù.  
TEST2_API int nTest2=0;  
 
// ³»º¸³½ ÇÔ¼öÀÇ ¿¹Á¦ÀÔ´Ï´Ù.  
TEST2_API int fnTest2(void)  
{  
        return 42;  
}  
 
// ³»º¸³½ Ŭ·¡½ºÀÇ »ý¼ºÀÚÀÔ´Ï´Ù.  
CTest2::CTest2()  
{  
        return;  
}  

// dllmain.cpp : DLL ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. 
#include <windows.h> 
 
BOOL APIENTRY DllMain( HMODULE 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; 
} 
 

// »ç¿ëÇÏ´Â.cpp 
 
#include "Test2.h" 
#pragma comment(lib, "Test2.lib")