TN058: MFC ¸ðµâ »óÅ ±¸Çö

ÀÌ ±â¼ú ³ëÆ® 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 ¼­¹ö ·Îµå °³Ã¼¸¦ ¸¸µé°í ÇØ´ç ¸Þ¼­µå¸¦ È£Ãâ ÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ¡£

  1. LoadLibrary ¸¦ »ç¿ë ÇÏ ¿© OLE DLLÀº ·Îµå¡£

  2. RawDllMain ¸ÕÀú È£Ã⠵˴ϴÙ. ±×°ÍÀº ¾Ë·ÁÁøµÈ Á¤Àû ¸ðµâ »óŸ¦ ÇØ´ç DLL¿¡ ´ë ÇÑ ¸ðµâ »óŸ¦ ¼³Á¤ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î RawDllMain Á¤ÀûÀ¸·Î DLL¿¡ ¿¬°á µÇ¾î¡£

  3. ¿ì¸®ÀÇ °³Ã¼¿Í °ü·Ã µÈ Ŭ·¡½º °øÀå¿¡ ´ë ÇÑ »ý¼ºÀÚ È£Ã⠵˴ϴÙ. COleObjectFactory CCmdTarget ¿¡¼­ ÆÄ»ý ÇÏ °í ±× °á°ú, ±×°ÍÀº ÀνºÅϽºÈ­µÈ ¸ðµâ »óÅ¿¡ ±â¾ï. ÀÌ°ÍÀº Áß¿ä ÇÏ´Ù-Ŭ·¡½º ÆÑÅ͸® °³Ã¼¸¦ ¸¸µå´Â ¿äû Çϸé Áö±ÝÀº ÃֽŠ¸ðµâ »óÅ·Π¾Ë°í¡£

  4. DllGetClassObject Ŭ·¡½º ÆÑÅ͸®¸¦ ¾ò±â À§ÇØ È£Ã⠵˴ϴÙ. MFCÀÌÀÌ ¸ðµâ ¿¬°ü Ŭ·¡½º °øÀå ¸ñ·ÏÀ» °Ë»ö ÇÏ °í ¹Ýȯ¡£

  5. COleObjectFactory::XClassFactory2::CreateInstance ¶ó°í ÇÕ´Ï´Ù. °³Ã¼¸¦ ¸¸µé±â Àü¿¡ ±×°ÍÀ» ¹ÝȯÀÌ ÇÔ¼ö´Â ´Ü°è 3 (Àº COleObjectFactory ¸¦ ÀνºÅϽºÈ­ÇÒ ¶§ ÇöÀç Çϳª)¿¡¼­ ÇöÀç ¸ðµâ »óŸ¦ ¸ðµâ »óŸ¦ ¼³Á¤ ÇÕ´Ï´Ù. ÀÌ METHOD_PROLOGUE ÀÇ ³»ºÎ ÀÌ·ç¾îÁý´Ï´Ù.

  6. ¶§ °³Ã¼°¡ ¸¸µé¾îÁø, ±×°ÍÀº ³Ê¹« CCmdTarget ÆÄ»ý ÀÌ¸ç µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î COleObjectFactory ±â¾ï ¸ðµâ »óÅ´ Ȱ¼º, ±×·¡¼­ÀÌ »õ °³Ã¼¸¦ ¾Ê½À´Ï´Ù. °³Ã¼¸¦ Àüȯ ÇÏ´Â ¸ðµâ »óŸ¦ ¾Ë°í Áö±ÝÀº È£ÃâÇÒ ¶§¸¶´Ù¡£

  7. Ŭ¶óÀ̾ðÆ®´Â CoCreateInstance È£Ã⠷κÎÅÍ ¹ÞÀº OLE COM °³Ã¼¿¡´Â ÇÔ¼ö¸¦ È£Ãâ ÇÕ´Ï´Ù. ÇØ´ç °³Ã¼¸¦ È£Ãâ ÇÏ´Â °æ¿ì METHOD_PROLOGUE ¸¦ »ç¿ë ÇÏ ¿© ±×³É COleObjectFactory ó·³ ¸ðµâ »óŸ¦ Àüȯ ÇÏ·Á¸é¡£

º¸½Ã ´Ù½Ã ÇÇ, ¸ðµâ »óÅ ÀüÆÄ µË´Ï´Ù °³Ã¼¿¡¼­ °³Ã¼°¡ ¸¸µé¾îÁö´Â °æ¿ì. ±×°ÍÀº ¸ðµâ »óŸ¦ ÀûÀý ÇÏ °Ô ¼³Á¤ ÇÏ´Â °ÍÀÌ Áß¿ä ÇÕ´Ï´Ù. ±×°ÍÀ» È£Ãâ ÇÏ´Â ¶Ç´Â ÀÚü ¸®¼Ò½º¸¦ ãÀ» ¼ö ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù ºñÂü ÇÏ °Ô ´Ù¸¥ ¹æ¹ýÀ¸·Î ½ÇÆÐÇÒ ¼ö ÀÖ½À´Ï´Ù ÇÏ´Â 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)

Index