ÀÌ ±â¼ú ³ëÆ® MFC "¸ðµâ »óÅÂ"ÀÇ ±¸ÇöÀ» ¼³¸íÇÕ´Ï´Ù. MFC¸¦ »ç¿ë ÇÏ ¿© °øÀ¯ DLL¿¡¼ Dll¿¡ ´ë ÇÑ ¸ðµâ »óÅ ±¸Çö¿¡ ´ë ÇÑ ÀÌÇØ´Â Áß¿ä ÇÑ (¶Ç´Â OLE in-process ¼¹ö)¡£
ÀÌ ³ëÆ®¸¦ Àбâ Àü¿¡ ÂüÁ¶ ÇϽʽÿÀ "°ü¸®´Â µ¥ÀÌÅÍ MFC ¸ðµâÀÇ »óÅÂ"¿¡ »õ ¹®¼ ¸¸µé±â, â°ú º¸±â¿¡¼ Visual c + + ÇÁ·Î±×·¡¸Ó °¡À̵å. ÀÌ ¹®¼¿¡¼´ÂÀÌ ÁÖÁ¦¿¡ ´ë ÇÑ °³¿ä Á¤º¸ ¹× Áß¿ä ÇÑ »ç¿ë Á¤º¸¡£
°³¿ä
°Å±â¿¡ ¼¼ °¡Áö Á¾·ùÀÇ MFC »óÅ Á¤º¸: ¸ðµâ »óÅÂ, ÇÁ·Î¼¼½º »óÅÂ, ¹× ½º·¹µå »óÅÂ. ¶§·Î´Â ÀÌ·¯ÇÑ »óÅ À¯Çü°ú °áÇÕ µÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, MFCÀÇ ÇÚµé Áöµµ ·ÎÄà ¸ðµâ ¹× ½º·¹µå ·ÎÄÃ. ÀÌ·¸°Ô ÇÏ¸é °¢ ±×µéÀÇ ½º·¹µå¿¡¼ ´Ù¸¥ Áöµµ¸¦ ¼·Î ´Ù¸¥ µÎ ¸ðµâ¡£
½º·¹µå ¹× ÇÁ·Î¼¼½º »óÅ´ À¯»ç ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ µ¥ÀÌÅÍ Ç׸ñÀº ÀüÅëÀûÀ¸·Î Àü¿ª º¯¼ö ¿ÔÁö¸¸ ƯÁ¤ ÁöÁ¤µÈ µÈ ÇÁ·Î¼¼½º ¶Ç´Â ½º·¹µå ¶Ç´Â ÀûÀý ÇÑ Win32s Áö¿ø¿¡ ´ë ÇÑ ÀûÀý ÇÑ ´ÙÁß ½º·¹µù Áö¿ø¿¡ ´ë ÇÑ Çʿ䰡 ÀÖÀ» °ÍÀÔ´Ï´Ù. ÁöÁ¤ÇÑ µ¥ÀÌÅÍ Ç׸ñ¿¡ ¸Â´Â ¹üÁÖ Ç׸ñ ¹× ÇÁ·Î¼¼½º ¹× ½º·¹µå °æ°è¿¡ °üÇØ¼´Â ±× ¿øÇÏ´Â ÀÇ¹Ì Ã¼°è¿¡ µû¶ó ´Þ¶ó Áý´Ï´Ù.
¸ðµâ »óÅ´ °íÀ¯ÀÇ ±×°Í ÁøÁ¤ÇÑ ±Û·Î¹ú »óÅ ¶Ç´Â ·ÎÄà ÇÁ·Î¼¼½º ¶Ç´Â ½º·¹µå ·ÎÄà »óÅ¿¡ Æ÷ÇÔ µÉ ¼ö ÀÖ½À´Ï´Ù. ±×°ÍÀº ¶ÇÇÑ ½Å¼Ó ÇÏ °Ô Àüȯ µÉ ¼ö ÀÖ´Ù¡£
¸ðµâ »óÅ Àüȯ
"ÇöÀç" ¶Ç´Â "Ȱ¼º" ¸ðµâ »óÅ¿¡ ´ë ÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔ ÇÏ´Â °¢ ½º·¹µå (¾Æ´Ï³ª ´Ù¸¦±î, Æ÷ÀÎÅÍÀÇ ÀϺÎÀÎ MFCÀÇ ½º·¹µå ·ÎÄà »óÅÂ). ½ÇÇà ½º·¹µå´Â OLE ÄÁÆ®·Ñ È£Ã⠴ٽà ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î, OLE ÄÁÆ®·Ñ ¶Ç´Â DLL È£Ãâ ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î °°Àº ¸ðµâ °æ°è¸¦ Åë°úÇÒ ¶§ÀÌ Æ÷ÀÎÅÍ º¯°æ¡£
AfxSetModuleState¸¦ È£Ãâ ÇÏ ¿© ÇöÀç ¸ðµâ »óŰ¡ Àüȯ µË´Ï´Ù. ´ëºÎºÐÀÇ ºÎºÐÀ» µé¾î, ´ç½ÅÀº °áÄÚ API¿Í Á÷Á¢ °Å·¡. MFC, ¸¹Àº °æ¿ì¿¡, ÀüÈ ±×°Í ´ç½ÅÀ» À§ÇØ (¿¡¼ WinMain, OLE ÁøÀÔÁ¡ AfxWndProc, µî). ÀÌ Æ¯º° ÇÑ¿¡ Á¤ÀûÀ¸·Î ¿¬°á ÇÏ ¿© ÀÛ¼º ÇÏ´Â ¸ðµç ±¸¼º ¿ä¼Ò¿¡¼ ÀÌ·ç¾îÁý´Ï´Ù WndProc±×¸®°í Ưº° ÇÑ WinMain (¶Ç´Â DllMain)´Â ¸ðµâ »óŸ¦ ÇöÀç ÇØ¾ßÇÑ´Ù ¾Ë°í ÀÖ´Ù. DLLMODUL »ìÆìº¸°íÀÌ Äڵ带 º¼ ¼ö ÀÖ½À´Ï´Ù.CPP ¶Ç´Â APPMODULÀÔ´Ï´Ù.CPP MFC\SRC µð·ºÅ͸®¿¡¡£
±×°ÍÀº µå¹® ¸ðµâ »óŸ¦ ¼³Á¤ ÇÏ °í ´ÙÀ½ ´Ù½Ã ¼³Á¤ ÇÏÁö ÇÕ´Ï´Ù. "" ´ç½ÅÀÇ ÀÚ½ÅÀÇ ¸ðµâÀ» ¹Ð¾î ½Ã°£ÀÇ ´ëºÎºÐ ÇöÀç Çϳª·Î »óÅ ¹× ´ÙÀ½, ÈÄ¿¡ ÇÒ ¼ö ÀÖ½À´Ï´Ù, "ÆË" ¿ø·¡ ÄÁÅØ½ºÆ®¸¦ ´Ù½Ã. ÀÌ AFX_MANAGE_STATE ¸ÅÅ©·Î ¹× Ư¼ö Ŭ·¡½º AFX_MAINTAIN_STATE ¿¡ ÀÇÇØ ÀÌ·ç¾îÁý´Ï´Ù.
CCmdTarget ¸ðµâ »óÅ ÀüȯÀ» Áö¿ø Çϱâ À§ÇÑ Æ¯º° ÇÑ ±â´ÉÀ» ÇϰíÀÖ´Ù. ƯÈ÷, CCmdTarget ·çÆ® Ŭ·¡½º OLE ÀÚµ¿È ¹× »ç¿ë µÇ´Â OLE COM ÁøÀÔÁ¡ÀÔ´Ï´Ù. ´Ù¸¥ ½ÃÀÛ ÁöÁ¡ ó·³ ½Ã½ºÅÛ¿¡ ³ëÃâ, ÀÌ·¯ÇÑ ÁøÀÔÁ¡ ¿Ã¹Ù¸¥ ¸ðµâ »óÅ·Π¼³Á¤ ÇØ¾ß ÇÕ´Ï´Ù. ÁÖ¾îÁøµÈ CCmdTarget ¹× "¿Ã¹Ù¸¥" ¸ðµâ »óŸ¦ ¾î¶»°Ô ÇØ¾ß ´ë ÇÑ ¾Ë°í? ´ë´äÀº ±×°ÍÀº "±â¾ï" "ÇöÀç" ¸ðµâ »óÅ ¸¸µé¾îÁú ¶§ ÀÌ´Ù, ±×°ÍÀ» ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇöÀç ¸ðµâ »óŸ¦ "±â¾ï" °ª ³ªÁß ¶§ È£Ãâ ÇÕ´Ï´Ù. ±× °á°ú, ÁÖ¾îÁøµÈ CCmdTarget °³Ã¼¿Í °ü·Ã µÈ ¸ðµâ »óÅ¿¡¼ °³Ã¼¸¦ »ý¼ºÇÒ ¶§ ÇöÀç ¸ðµâ »óŰ¡ÀÔ´Ï´Ù. INPROC ¼¹ö ·Îµå °³Ã¼¸¦ ¸¸µé°í ÇØ´ç ¸Þ¼µå¸¦ È£Ãâ ÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ¡£
º¸½Ã ´Ù½Ã ÇÇ, ¸ðµâ »óÅ ÀüÆÄ µË´Ï´Ù °³Ã¼¿¡¼ °³Ã¼°¡ ¸¸µé¾îÁö´Â °æ¿ì. ±×°ÍÀº ¸ðµâ »óŸ¦ ÀûÀý ÇÏ °Ô ¼³Á¤ ÇÏ´Â °ÍÀÌ Áß¿ä ÇÕ´Ï´Ù. ±×°ÍÀ» È£Ãâ ÇÏ´Â ¶Ç´Â ÀÚü ¸®¼Ò½º¸¦ ãÀ» ¼ö ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù ºñÂü ÇÏ °Ô ´Ù¸¥ ¹æ¹ýÀ¸·Î ½ÇÆÐÇÒ ¼ö ÀÖ½À´Ï´Ù ÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ DLL ¶Ç´Â COM °³Ã¼ ¼ö ÀÖ½À´Ï´Ù Á¦´ë·Î »óÈ£ ÀÛ¿ë ¼³Á¤ µÇÁö ¾ÊÀº °æ¿ì¡£
Âü°í Dll, ƯÈ÷ "MFC È®Àå" DllÀÇ Æ¯Á¤ Á¾·ùÀÇ RawDllMain ¿¡¼ ¸ðµâ »óŸ¦ Àüȯ ÇÏÁö ¾Ê½À´Ï´Ù (½ÇÁ¦·Î, ±×µéÀº ÀϹÝÀûÀ¸·Î ½ÉÁö¾î ¾ø¾î RawDllMain). ÀÌ ¶§¹®¿¡ ±×µéÀº "¸¶Ä¡" ±×µéÀº ±×µéÀ» »ç¿ë ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ½ÇÁ¦·Î Á¸Àç Çൿ Çϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. ±×µéÀº ¾ÆÁÖ ¸¹ÀÌ ½ÇÇà µÇ´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÀϺΠÀÌ¸ç ±×µéÀÇ Àǵµ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Àü¿ª »óŸ¦ ¼öÁ¤ ÇÏ·Á¸é¡£
OLE ÄÁÆ®·Ñ ¹× ´Ù¸¥ DllÀº ¸Å¿ì ´Ù¸£´ÙÀÔ´Ï´Ù. È£Ãâ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ »óÅÂ; ¼öÁ¤ ÇÏÁö ¾ÊÀ¸·Á´Â ±×µéÀ» È£Ãâ ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡µµ MFC ÀÀ¿ë ÇÁ·Î±×·¥ ¸øÇÒ °í ±×·¡¼ ¼öÁ¤ »óŰ¡ µÉ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ¸ðµâ »óÅ Àüȯ ¹ß¸í Çß´Ù ÀÌÀ¯ ÀÌ´Ù¡£
DLL¿¡¼ ´ëÈ »óÀÚ¸¦ ½ÃÀÛ ÇÏ´Â °Í°ú °°Àº DLL¿¡¼ ³»º¸³½µÈ ÇÔ¼ö¿¡ ´ë ÇÑ ÇÔ¼öÀÇ ½ÃÀÛ ºÎºÐ¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ ÇØ¾ß:
AFX_MANAGE_STATE (AfxGetStaticModuleState ())
ÀÌ ÇöÀç ¹üÀ§ ³¡±îÁö AfxGetStaticModuleState ¿¡¼ ¹Ýȯ ÇÏ´Â »óÅÂ¿Í ÇöÀç ¸ðµâ »óŸ¦ ½º¿Ò¡£
AFX_MODULE_STATE ¸ÅÅ©·Î »ç¿ë ÇÏÁö ¾ÊÀ¸¸é ¸®¼Ò½º Dll¿¡ ¹®Á¦°¡ ¹ß»ý ÇÕ´Ï´Ù. ±âº»ÀûÀ¸·Î MFC ¸®¼Ò½º ÅÛÇø´À» ·Îµå ÇÏ´Â ÁÖ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸®¼Ò½º ÇÚµéÀ» »ç¿ë ÇÕ´Ï´Ù. ÀÌ ÅÛÇø´Àº ½ÇÁ¦·Î DLL¿¡ ÀúÀå µË´Ï´Ù. ±Ùº» ¿øÀÎÀ» MFCÀÇ ¸ðµâ »óÅ Á¤º¸ AFX_MODULE_STATE ¸ÅÅ©·Î·Î Àüȯ µÇÁö ¾Ê½À´Ï´Ù. ¸®¼Ò½º ÇÚµéÀº MFCÀÇ ¸ðµâ »óÅ¿¡¼ º¹±¸ µË´Ï´Ù. À߸ø µÈ ¸®¼Ò½º ÇÚµéÀ» »ç¿ë ÇÏ¸é ¸ðµâ »óŸ¦ Àüȯ ÇÏÁö¡£
AFX_MODULE_STATE DLLÀÇ ¸ðµç ÇÔ¼ö¿¡ ³ÖÀÌ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ¿¹¸¦ µé¾î, InitInstance MFC´Â Àü¿¡ ¸ðµâ »óŸ¦ ÀÚµ¿À¸·Î À̵¿ Çϱ⠶§¹®¿¡ AFX_MODULE_STATE ¾øÀÌ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ MFC Äڵ忡¼ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù InitInstance ¹× ´ÙÀ½ ´Ù½Ã ÈÄ ½ºÀ§Ä¡ InitInstance ¹Ýȯ ÇÕ´Ï´Ù. ¸ðµç ¸Þ½ÃÁö ¸Ê 󸮱⿡ ´ë ÇÑ ¸¶Âù°¡ÁöÀÔ´Ï´Ù. ±âº» Dll ½ÇÁ¦·Î ¸Þ½ÃÁö¸¦ ¶ó¿ìÆÃÇϱâ Àü¿¡ ¸ðµâ »óŸ¦ ÀÚµ¿À¸·Î Àüȯ Çϴ Ư¼ö ÇÑ ¸¶½ºÅÍ Ã¢ ÇÁ·Î½ÃÀú´Â¡£
·ÎÄà µ¥ÀÌÅÍ Ã³¸®
·ÎÄà µ¥ÀÌÅÍ Ã³¸® µî °ü½É»çÀÇ µÇÁö ¾ÊÀ» °Í À̶ó°í ±×°ÍÀÌ ¾ø ¾ú Win32s DLL ¸ðµ¨ÀÇ ¾î·Á¿ò¿¡ ´ë ÇÑ. Win32s¿¡¼ ¸ðµç Dll ¿©·¯ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ ·Îµå ÇÏ´Â °æ¿ì¿¡ ±×µéÀÇ ±Û·Î¹ú µ¥ÀÌÅ͸¦ °øÀ¯ ÇÕ´Ï´Ù. °¢ DLL DLL¿¡ ¿¬°á ÇÏ´Â °¢ ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌÅÍ °ø°£ÀÇ º°µµ º¹»çº»À» °¡Á®¿É´Ï´Ù "ÁøÂ¥" Win32 DLL µ¥ÀÌÅÍ ¸ðµ¨¿¡¼ ¿ÏÀüÈ÷ ´Ù¸£´Ù. º¹À⼺À» Ãß°¡ ÇÏ·Á¸é Win32s DLL¿¡¼ Èü¿¡ ÇÒ´ç µÈ µ¥ÀÌÅÍ´Â »ç½Ç ƯÁ¤ ÇÁ·Î¼¼½º (Àû¾îµµ Áö±Ý±îÁö ¼ÒÀ¯±Ç °£´Ù). ´ÙÀ½ µ¥ÀÌÅÍ ¹× Äڵ带 °í·Á:
Á¤Àû CString strGlobal; / / ÆÄÀÏ ¹üÀ§¿¡¼
__declspec (dllexport) void SetGlobalString(LPCTSTR lpsz)
{
strGlobal = lpsz;
}
__declspec (dllexport)
void GetGlobalString (LPCTSTR lpsz, int cb)
{
lstrcpyn (lpsz, strGlobal, cb);
}
ÀϾ´Â °æ¿ì À§ÀÇ Äڵ忡 ÀÖ´Â dll¿¡¼°ú DLLÀÌ A¿Í B (±×°ÍÀº, »ç½Ç, ¼ö °°Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ µÎ ÀνºÅϽº°¡) µÎ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ·Îµå µÇ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. È£Ãâ SetGlobalString("Hello from A") . A. °è¼Ó ¿°µÎ¿¡ µÎ°í ÀÚü CString ±Û·Î¹ú ÀÌ¸ç ¸ðµÎ A¿¡ °Ô Ç¥½Ã µË´Ï´Ù ÇÁ·Î¼¼½ºÀÇ ÄÁÅØ½ºÆ®¿¡¼ CString µ¥ÀÌÅÍ¿¡ ´ë ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇÏ´Â °á°ú·Î,¿Í B B¸¦ È£Ãâ ÇÏ´Â Áö±Ý GetGlobalString(sz, sizeof(sz)) . B ÁýÇÕ µ¥ÀÌÅ͸¦ º¼ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ÀÌ ¶§¹®¿¡ Win32s ó·³ Win32 ÇÁ·Î¼¼½º »çÀÌÀÇ º¸È£¸¦ Á¦°ø ÇÕ´Ï´Ù. ±×·¡¼ ù ¹øÂ° ¹®Á¦°¡; ¸¹Àº °æ¿ì¿¡ ±×°ÍÀº ÇϳªÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À» ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÇÇØ ¼ÒÀ¯·Î °£ÁÖ µÇ´Â ±Û·Î¹ú µ¥ÀÌÅÍ ¿µÇâÀ» ¹Ù¶÷Á÷ÇÑ¡£
±×·¯³ª ±â´ë-´õ ¸¹Àº ¹®Á¦°¡ ÀÖ´Ù. ±×´Â Áö±Ý Á¾·á °æ¿ì¸¦ °¡Á¤ÇØ º¾´Ï´Ù. ¶§ A Á¾·á¿¡ ÀÇÇØ »ç¿ë µÇ´Â ¸Þ¸ð¸®´Â ' strGlobal ' ¹®ÀÚ¿ ½Ã½ºÅÛ¿¡ ´ë ÇÑ »ç¿ëÇÒ ¼ö-ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÇÒ´ç µÈ ¸ðµç ¸Þ¸ð¸®´Â ¿î¿µ üÁ¦¿¡ ÀÇÇØ ÀÚµ¿À¸·Î ÇØÁ¦ µÇ´Â Áï. CString ¼Ò¸êÀÚ°¡ È£Ãâ µÇ °í; ¶§¹®¿¡ ÇØÁ¦ µÇÁö ¾Ê½À´Ï´Ù. ±×°ÍÀº ¾ÆÁ÷ È£Ãâ µÇÁö ¾Ê¾Ò½À´Ï´Ù. ´Ü¼øÈ÷ ÇØÁ¦ Çϱ⠶§¹®¿¡ ±×°ÍÀ» ÇÒ´ç ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥ ÇöÀå¿¡ ³²¾Æ ÀÖ´Ù. ÀÌÁ¦ B ¶ó´Â GetGlobalString(sz, sizeof(sz)) , À¯È¿ÇÑ µ¥ÀÌÅ͸¦ ¾òÀ» ¼ö ¾ø½À´Ï´Ù. ÀϺΠ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ »ç¿ë ÇÒ ¼ö ÀÖ½À´Ï´Ù ¸Þ¸ð¸®¸¦ ´Ù¸¥ ¿ëµµ·Î¡£
ºÐ¸íÈ÷ ¿©±â¿¡ ¹®Á¦°¡ ÀÖ´Ù. MFC 3.x ½º·¹µå ·ÎÄà ÀúÀå¼Ò (TLS) À̶ó´Â ±â¼úÀ» »ç¿ë ÇÕ´Ï´Ù. MFC 3.x À̶ó´Â µÇÁö ¾Ê½À´Ï´Ù ºñ·Ï win32s¿¡¼ Á¤¸» ÇÁ·Î¼¼½º ·ÎÄà ÀúÀå¼Ò À妽º ¿ªÇÒÀ» ÇÏ´Â TLS À妽º¸¦ ÇÒ´çÇÒ °Í À̶ó°í ÇÏ °í TLS À妽º¸¦ ±â¹ÝÀ¸·Î ÇÏ´Â ¸ðµç µ¥ÀÌÅ͸¦ ÂüÁ¶ ÇÏ´Â °Í ÀÌ´Ù. À̰ÍÀº win32¿¡¼ ½º·¹µå ·ÎÄà µ¥ÀÌÅ͸¦ ÀúÀå ÇÏ´Â µ¥ »ç¿ë µÈ TLS À妽º ºñ½ÁÇÕ´Ï´Ù (±× ÁÖÁ¦¿¡ ´ë ÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ ÂüÁ¶). ÀÌ ÇÁ·Î¼¼½º ´ç Àû¾îµµ µÎ °³ÀÇ TLS À妽º¸¦ Ȱ¿ë ÇÏ·Á¸é ¸ðµç MFC DLLÀ» ¹ß»ý ÇÕ´Ï´Ù. ¸¹Àº OLE ÄÁÆ®·Ñ Dll (OCXs)¸¦ ·Îµå ÇÏ´Â °Í¿¡ ´ë ÇÑ °èÁ¤ ¶§ ½Å¼Ó ÇÏ °Ô (°Å±â 64¸¸ °¡´É)´Â TLS À妽ºÀÇ ¹ÛÀ¸·Î ½ÇÇà ÇÕ´Ï´Ù. ¶ÇÇÑ, MFC ´ÜÀÏ ±¸Á¶¿¡¼ ÇÑ °÷¿¡¼ÀÌ ¸ðµç µ¥ÀÌÅ͸¦ ¹èÄ¡ Çß´Ù. ¸Å¿ì È®Àå ÇÏÁö ¾Ê¾Ò°í´Â TLS À妽ºÀÇ »ç¿ë°ú °ü·Ã ÇÏ ¿© ÀÌ»óÀûÀΡ£
MFC 4.x Ŭ·¡½º ÅÛÇø´Àº ÀÖ½À´Ï´Ù ¼ö "·¡ÇÎ" ÇÁ·Î¼¼½º ·ÎÄà µÇ¾î¾ß ÇÏ´Â µ¥ÀÌÅÍ ÁýÇÕÀ¸·ÎÀÌ ÇØ°á ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, À§¿¡¼ ¾ð±Þ ÇÑ ¹®Á¦¸¦ ÀÛ¼º ÇÏ ¿© ÇØ°á µÉ ¼ö ÀÖ½À´Ï´Ù.:
±¸Á¶Ã¼ CMyGlobalData: °ø°ø CNoTrackObject
{
CString strGlobal;
};
CProcessLocallt;CMyGlobalData > globalData;
__declspec (dllexport) void SetGlobalString(LPCTSTR lpsz)
{
globalData-> strGlobal = lpsz;
}
__declspec (dllexport)
void GetGlobalString (LPCTSTR lpsz, int cb)
{
lstrcpyn (lpsz, globalData-> strGlobal, cb);
}
MFC´Â µÎ ´Ü°è¿¡ÀÌ ±¸ÇöÇÕ´Ï´Ù. ù°, »ó´Ü¿¡´Â Win32 Tls * Api (TlsAlloc, TlsSetValue, TlsGetValue, µî)¿¡ »ó°ü ¾øÀÌ ´ç½ÅÀÌ ¾ó¸¶³ª ¸¹Àº Dll ÇÁ·Î¼¼½º ´ç µÎ °³ÀÇ TLS À妽º¸¦ »ç¿ë ÇÏ´Â °èÃþÀÌÀÔ´Ï´Ù. µÎ ¹øÂ°´Â CProcessLocal ¼½Ä ÆÄÀÏÀÌÀÌ µ¥ÀÌÅÍ ¾×¼¼½º¸¦ Á¦°ø ÇÕ´Ï´Ù. ¿¬»êÀÚ-gt; ¹«½Ã ¾î´À °ÍÀÌ ¾î¶² Á÷°üÀûÀÎ ±¸¹® À§¿¡¼ º¼ ¼ö ÀÖ½À´Ï´Ù. ¸ðµç °³Ã¼¿¡ ÀÇÇØ ½Î¿© CProcessLocal ¿¡¼ ÆÄ»ý µÇ¾î¾ß ÇÕ´Ï´Ù CNoTrackObject . CNoTrackObject Á¦°ø ÇÏ´Â ÇÏÀ§ ¼öÁØ ÇÒ´çÀÚ (LocalAlloc/LocalFree)¿Í °¡»ó ¼Ò¸êÀÚ´Â ÇÁ·Î¼¼½º°¡ Á¾·á µÉ ¶§ MFC ÇÁ·Î¼¼½º ·ÎÄà °³Ã¼¸¦ ÀÚµ¿À¸·Î ÆÄ±«ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °³Ã¼´Â Ãß°¡ Á¤¸® ÇØ¾ß ÇÏ´Â °æ¿ì »ç¿ëÀÚ Á¤ÀÇ ¼Ò¸êÀÚ¸¦ °¡Áú ¼ö ÀÖ½À´Ï´Ù. ¶§¹®¿¡ ÄÄÆÄÀÏ·¯°¡ Æ÷ÇÔµÈ CString °³Ã¼ ÆÄ±« ±âº» ¼Ò¸êÀÚ »ý¼º µË´Ï´Ù À§ÀÇ ¿¹Á¦, ÇÊ¿ä ÇÏÁö ¾Ê½À´Ï´Ù(&G).
ÀÌ Á¢±Ù ¹æ½Ä¿¡ ´Ù¸¥ Àç¹Ì ÀÖ´Â ÀÌÁ¡ÀÌ ÀÖ´Ù. »Ó¸¸ ¾Æ´Ï¶ó ¸ðµç ÇÏ´Â CProcessLocal °³Ã¼¸¦ ÀÚµ¿À¸·Î ÆÄ±« ÇÊ¿äÇÒ ¶§±îÁö »ý¼º µÇÁö ¾Ê½À´Ï´Ù. CProcessLocal::operator-gt; ¶ó°í, óÀ½À¸·Î ¿¬°á µÈ °³Ã¼¿Í ¾Æ¹« »¡¸® ÀνºÅϽºÈÇÕ´Ï´Ù. À§ÀÇ ¿¹Á¦¿¡¼ ±× Àǹ̴ ' strGlobal ' ¹®ÀÚ¿ óÀ½À¸·Î SetGlobalString ¶Ç´Â GetGlobalString °¡ È£Ãâ µÉ ¶§±îÁö »ý¼º µÇÁö ¾Ê½À´Ï´Ù. ¾î¶² °æ¿ì¿¡ÀÌ DLL ½ÃÀÛ ½Ã°£À» ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù(&G).
½º·¹µå ·ÎÄà µ¥ÀÌÅÍ
·ÎÄà µ¥ÀÌÅÍ Ã³¸®¿Í ¸¶Âù°¡Áö·Î, ½º·¹µå ·ÎÄà µ¥ÀÌÅÍ »ç¿ë µË´Ï´Ù µ¥ÀÌÅÍ ÁÖ¾îÁøµÈ ÁÖÁ¦¿¡ ·ÎÄà À̾î¾ß ÇÕ´Ï´Ù. Áï, ÇØ´ç µ¥ÀÌÅÍ¿¡ ¾×¼¼½º ÇÏ´Â °¢ ½º·¹µå¿¡ ´ë ÇÑ µ¥ÀÌÅÍÀÇ º°µµ ÀνºÅϽº°¡ ÇÊ¿ä ÇÕ´Ï´Ù. ÀÌ ¿©·¯ ¹ø »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù ±¤¹üÀ§ ÇÑ µ¿±âÈ ¸ÞÄ¿´ÏÁòÀ» ´ë½Å ÇÕ´Ï´Ù. µ¥ÀÌÅ͸¦ ¿©·¯ ½º·¹µå¿¡¼ °øÀ¯ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù, ºñ½Î°í ºÒÇÊ¿ä ÇÑ °°Àº ¸ÞÄ¿´ÏÁòÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. (À§ÀÇ »ùÇÃ) ó·³ CString °³Ã¼¸¦ Çß½À´Ï´Ù °¡Á¤ÇØ º¾½Ã´Ù. ¿ì¸®°¡ ±×°ÍÀ» ¸¸µé ¼ö ½º·¹µå ·ÎÄÃ¿Í ±×°ÍÀ» Æ÷Àå ÇÏ ¿©´Â CThreadLocal ¼½Ä ÆÄÀÏ:
±¸Á¶Ã¼ CMyThreadData: °ø°ø CNoTrackObject
{
CString strThread;
};
CThreadLocallt;CMyThreadData > threadData;
void MakeRandomString()
{
/ / Ä«µå ¼ÅÇà (Å« °Í)ÀÇ Á¾·ù
CString & str = threadData-> strThread;
strÀÔ´Ï´Ù.Empty();
µ¿¾È (str.GetLength()! = 52)
{
TCHAR ch = rand () %52 + 1;
°æ¿ì (str.Find(ch) < 0)
str + = ä³Î; / / ÇÏÁö ¹ß°ß, ±×°ÍÀ» Ãß°¡
}
}
¸¸¾à MakeRandomString ¶ó´Â µÎ °³ÀÇ ¼·Î ´Ù¸¥ ½º·¹µå¿¡¼ °¢ °Í "¼ÅÇÃ" ¹®ÀÚ¿ ´Ù¸¥ ¹æ¹ýÀ¸·Î ´Ù¸¥ ¹æÇØ ÇÏÁö ¾Ê°í. À̰ÍÀº ¾ø±â ¶§¹®¿¡ ½ÇÁ¦·Î strThread ÀνºÅϽº Çϳª¸¸ Àü¿ª ÀνºÅϽº ´ë½Å ½º·¹µå ´ç¡£
Note ·çÇÁ ¹Ýº¹ ¸¶´Ù ÇÑ ¹ø ´ë½Å ÇÑ ¹ø CString ÁÖ¼Ò¸¦ ĸó¿¡ ´ë ÇÑ ÂüÁ¶¸¦ »ç¿ë ÇÏ´Â ¹æ¹ý. ·çÇÁ ÄÚµå¿Í ÀÛ¼º µÇ¾ú½À´Ï´Ù threadData-gt;strThread »ç¹æ ' str '¸¦ »ç¿ë ÇÏÁö¸¸ ÄÚµå´Â ÈξÀ ´À¸®°Ô ½ÇÇà µÉ °Í À̶ó°í ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ÂüÁ¶ ·çÇÁ¿¡¼ ¹ß»ý ÇÏ´Â °æ¿ì µ¥ÀÌÅÍ¿¡ ´ë ÇÑ ÂüÁ¶¸¦ ij½Ã ÇÏ´Â °ÍÀÌ °¡Àå ÁÁ½À´Ï´Ù(&G).
CThreadLocalŬ·¡½º ÅÛÇø´¿¡¼ µ¿ÀÏÇÑ ¸ÞÄ¿´ÏÁòÀ» »ç¿ë ÇÏ´Â CProcessLocal °¡ °°Àº ±¸Çö ±â¹ý¡£
±â¼ú ³ëÆ® ¹øÈ£·Î |nbsp; Ä«Å×°í¸®º° ±â¼ú ³ëÆ®(&N)