| DLL | UserPreferences |
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")
EditText
of this page
(last modified 2010-04-24 00:28:28)
FindPage
by browsing, searching, or an index
Or try one of these actions:
DeletePage,
DeleteUploadedFile,
LikePages,
SpellCheck,
UploadFile