TN038: MFC/OLE IUnknown ±¸Çö

OLE 2ÀÇ ÇÙ½ÉÀº "OLE ±¸¼º ¿ä¼Ò °³Ã¼ ¸ðµ¨", ¶Ç´Â COM. COM Ç¥ÁØ Á¤ÀÇ ¾î¶»°Ô Çù·Â °³Ã¼¿¡ ´ë ÇÑ ¼­·Î Åë½Å ÇÕ´Ï´Ù. "°³Ã¼" ¾î¶² ¸ð¾ç ¸Þ¼­µå °³Ã¼¿¡ ¹ß¼Û µÇ´Â ¹æ¹ý µîÀÇ ³»¿ëÀ» Æ÷ÇÔ ÇÕ´Ï´Ù. COM ¸ðµç COM ȣȯ Ŭ·¡½º°¡ ÆÄ»ý µÇ´Â ±âº» Ŭ·¡½º¸¦ Á¤ÀÇ ÇÕ´Ï´Ù. ÀÌ ±âº» Ŭ·¡½º´Â IUnknownÀÔ´Ï´Ù. COMÀº ¾î¶² ÇϳªÀÇ ¾ð¾î ƯÁ¤ IUnknown ÀÎÅÍÆäÀ̽º c + + Ŭ·¡½º ¶ó°íµµ, ºñ·Ï ? C, ÆÄ½ºÄ®, ¶Ç´Â COM °³Ã¼ÀÇ ÀÌÁø ·¹À̾ƿôÀÌ Áö¿øÇÒ ¼ö ÀÖ´Â ´Ù¸¥ ¾ð¾î¿¡¼­ ±¸Çö µÉ ¼ö ÀÖ´Ù¡£

OLE "ÀÎÅÍÆäÀ̽º"À¸·Î IUnknown ¿¡¼­ ÆÄ»ý µÈ ¸ðµç Ŭ·¡½º¸¦ ¸»ÇÕ´Ï´Ù IUnknown ±×°É·Î ¿î¹Ý ±¸ÇöÀÌ °°Àº "ÀÎÅÍÆäÀ̽º" ÀÌÈÄ Áß¿ä ÇÑ Â÷ÀÌÀÔ´Ï´Ù. ±×°ÍÀº ´Ü¼øÈ÷´Â °³Ã¼ Åë½Å, ¾Æ´Ï¶ó ±× ±¸Çö ÇÒ ±¸Ã¼ÀûÀÎ ÇÁ·ÎÅäÄÝÀ» Á¤ÀÇ ÇÕ´Ï´Ù. À̰ÍÀº ÃÖ´ëÀÇ À¯¿¬¼ºÀ» Çã¿ë ÇÏ´Â ½Ã½ºÅÛ¿¡ ´ë ÇÑ ÇÕ¸®Àû ÀÌ´Ù. ±×°ÍÀº MFC/c + + ÇÁ·Î±×·¥¿¡ ´ë ÇÑ ±âº» µ¿ÀÛÀ» ±¸Çö ÇÏ´Â MFCÀÇ Á÷¾÷¡£

MFCÀÇ ±¸Çö IUnknown À» ÀÌÇØ ÇÏ·Á¸é ¸ÕÀúÀÌ ÀÎÅÍÆäÀ̽º´Â ÀÌÇØ ÇØ¾ß ÇÕ´Ï´Ù. IunknownÀÇ ´Ü¼øÈ­ µÈ ¹öÀü ¾Æ·¡¿¡ Á¤ÀÇ µÈ:

 iUnknown Ŭ·¡½º
{
°ø°³:
 nbsp;? °¡»ó HRESULT QueryInterface(REFIID iid, void** ppvObj) = 0;
 ?? °¡»ó ULONG AddRef() = 0;
 ?? °¡»ó ULONG Release() = 0;
}(&N)

¸Þ¸ðnbsp;??ÀÌ ±×¸²¿¡ ´ë ÇÑ ¿¹: __stdcall È£Ãâ ÇÊ¿äÇÑ Æ¯Á¤ ±ÔÄ¢ ¼¼ºÎ ¹ÛÀ¸·Î ³²¾Æ ÀÖ´Ù(&N)¡£

AddRef ¹× ¸±¸®½º ¸â¹ö ÇÔ¼ö´Â °³Ã¼ÀÇ ¸Þ¸ð¸® °ü¸®¸¦ Á¦¾îÇÕ´Ï´Ù. COM ÂüÁ¶ Ä«¿îÆÃ ±¸¼ºÇ¥¸¦ »ç¿ë ÇÏ ¿© °³Ã¼¸¦ °è¼Ó ÃßÀû ÇØ¾ß ÇÕ´Ï´Ù. °³Ã¼°¡ ÂüÁ¶ ÇÏ´Â Àý´ë c + +¿¡¼­¿Í ¸¶Âù°¡Áö·Î Á÷Á¢. ´ë½Å, COM °³Ã¼´Â Ç×»ó Æ÷ÀÎÅ͸¦ ÅëÇØ ÂüÁ¶ µË´Ï´Ù. ¼ÒÀ¯ÀÚ ÇÒ ¶§ °³Ã¼¸¦ ÇØÁ¦ ÇÏ·Á¸é ±×°ÍÀ» »ç¿ë ÇÏ ¿© °³Ã¼ÀÇ ¸±¸®½º ¸â¹ö ¶ó°í (´ëÁ¶ÀûÀ¸·Î »ç¿ë ÇÏ´Â ¿¬»êÀÚ »èÁ¦, ±âÁ¸ c + + °³Ã¼¿¡ ´ë ÇÑ ÇÒ °Í ÀÌ´Ù). ¸ÞÄ¿´ÏÁòÀ» °è»ê ÇÏ´Â ÂüÁ¶¸¦ °ü¸®ÇÒ ¼ö ´ÜÀÏ °³Ã¼¿¡ ´ë ÇÑ ¿©·¯ ÂüÁ¶¸¦ Çã¿ë ÇÕ´Ï´Ù. °³Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö¸¦ À¯Áö ÇÏ´Â AddRef ¹× Release ±¸ÇöÀ» ? °³Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö°¡ 0¿¡ µµ´Þ µÉ ¶§±îÁö »èÁ¦ µÇÁö ¾Ê½À´Ï´Ù¡£

AddRef ¹× ¸±¸®½º ´Â ±¸Çö °üÁ¡¿¡¼­ ¸Å¿ì °£´Ü ÇÕ´Ï´Ù. ¿©±â´Â »ç¼ÒÇÑ ±¸Çö:

ULONG CMyObj::AddRef() {nbsp;? ¹Ýȯ + + m_dwRef; 
}

ULONG CMyObj::Release() {°æ¿ì (-m_dwRef = = 0) {
 ?????? »èÁ¦ÀÌ; 
 ?????? 0; ¹Ýȯ
 ?? }
 ?? ¹Ýȯ m_dwRef;
}(&N)

QueryInterface ¸â¹ö ÇÔ¼ö´Â Á» ´õ Èï¹Ì·Ó½À´Ï´Ù. ´ç½ÅÀÌ »ó»óÇÒ ¼ö ÀÖ´Â ¸Å¿ì Èï¹Ì·Î¿î AddRef ¹× ¸±¸®½º ´©±¸ÀÇ À¯ÀÏÇÑ ¸â¹ö ÇÔ¼ö´Â °³Ã¼°¡ ¾Æ´Ñ ? °³Ã¼ÀÇ IUnknown À» Á¦°ø ÇÏ´Â º¸´Ù ´õ ¸¹Àº ÀÏÀ» ÇÒ °Ô ÁÁÀ» ÅÙµ¥. À̰ÍÀº QueryInterface ÀÌ´Ù À¯¿ë ÇÏ´ÙÀÔ´Ï´Ù. µ¿ÀÏÇÑ °³Ã¼¿¡¼­ ´Ù¸¥ "ÀÎÅÍÆäÀ̽º"¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º´Â ÀϹÝÀûÀ¸·Î IUnknown ¿¡¼­ ÆÄ»ý ÇÏ °í »õ ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ ÇÏ ¿© Ãß°¡ ±â´ÉÀ» Ãß°¡. COM ÀÎÅÍÆäÀ̽º´Â °áÄÚ ÀÎÅÍÆäÀ̽º¿¡ ¼±¾ð µÈ ¸â¹ö º¯¼ö ÀÖ°í ¸ðµç ¸â¹ö ÇÔ¼ö´Â ¼ø¼ö °¡»óÀ¸·Î ¼±¾ð µË´Ï´Ù. ¿¹¸¦ µé¾î,

iPrintInterface Ŭ·¡½º: °ø¿ë IUnknown
{
°ø°³:
 nbsp;? °¡»ó void PrintObject() = 0;
}(&N)

´ÜÁö ´ç½ÅÀÌ °¡Áø´Ù¸é IUnknownÀ» Iprintinterface¸¦ ¾òÀ¸·Á¸é, iunknown:: Queryinterface ¸¦ IprintinterfaceÀÇ IID ¸¦ »ç¿ë ÇÏ ¿© È£Ãâ ÇÕ´Ï´Ù. IID ´Â ÀÎÅÍÆäÀ̽º¸¦ °íÀ¯ ÇÏ °Ô ½Äº° ÇÏ´Â 128 ºñÆ® ¼ýÀÚÀÔ´Ï´Ù. ¶Ç´Â OLE Á¤ÀÇ ÇÏ´Â °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ IID ÀÔ´Ï´Ù. ±×°Í À¸·ÎºÎÅÍ Iprintinterface¸¦ °Ë»ö ÇÏ´Â ÄÚµå ÀÖÀ» ÆãÅ© IUnknown °³Ã¼¿¡ ´ë ÇÑ Æ÷ÀÎÅÍ À̸é

IPrintInterface * pPrint = NULL;
°æ¿ì (ÆãÅ©-gt;QueryInterface(IID_IPrintInterface, (void**) & pPrint) = NOERROR)
{
 ?? pPrint-> PrintObject();
 ?? pPrint-> Release();   
 ?????? / / ¸±¸®½º Æ÷ÀÎÅÍ´Â Queryinterface¸¦ ÅëÇØ ¾òÀº
}

±× ¸Å¿ì ½¬¿î °Í °°ÀÌ º¸ÀÌÁö¸¸ IPrintInterface IUnknown ÀÎÅÍÆäÀ̽º¸¦ Áö ¿øÇÏ´Â °³Ã¼¸¦ ±¸ÇöÇÒ °Í À̶ó°í ¾î¶»°Ô? ÀÌ °æ¿ì¿¡ ±×°ÍÀº °£´Ü ÇÕ´Ï´Ù IPrintInterface IUnknown ¿¡¼­ Á÷Á¢ ÆÄ»ý µÈ ÀÌÈÄ ? Iprintinterface¸¦ ±¸Çö ÇÏ ¿© IUnknown ÀÚµ¿À¸·Î Áö¿ø µË´Ï´Ù. ¿¹¸¦ µé¾î:

 cPrintObj Ŭ·¡½º: °ø¿ë CPrintInterface
{
 nbsp;? °¡»ó HRESULT QueryInterface(REFIID iid, void** ppvObj);
 ?? °¡»ó ULONG AddRef();
 ?? °¡»ó ULONG Release();
 ?? °¡»ó void PrintObject();
}(&N)

AddRef ¹× Release ±¸ÇöÀÌ µÉ °Í À̶ó°í Á¤È®È÷ À§¿¡ ±¸Çö µÈ °Í°ú µ¿ÀÏ ÇÕ´Ï´Ù. CPrintObj::QueryInterface ÀÌ·±½ÄÀ¸·Î »ý°åÀ» °Í ÀÌ´Ù

HRESULT CPrintObj::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
 nbsp;? °æ¿ì (iid IID_IUnknown = = | | iid = IID_IPrintInterface)
 ?? {
 ?????? * ppvObj =ÀÌ;
 ?????? AddRef();
 ?????? ¹Ýȯ NOERROR;
 ?? }
 ?? ¹Ýȯ ResultFromScode(E_NOINTERFACE);
}(&N)

Æ÷ÀÎÅͰ¡ °³Ã¼; ¹Ýȯ µË´Ï´Ù º¼ ¼ö ÀÖµíÀÌ, ÀÎÅÍÆäÀ̽º ½Äº°ÀÚ (IID)¸¦ ÀÎ½Ä ÇÏ´Â °æ¿ì, ±×·¸Áö ¾ÊÀ¸¸é ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. ¶ÇÇÑ ¼º°øÀûÀÎ QueryInterface ¹¬½ÃÀûµÈ AddRef¿¡ °á°ú ³ëÆ®. ¹°·Ð, ¶ÇÇÑ ÇØ¾ß CEditObj::Print¸¦ ±¸Çö ÇÕ´Ï´Ù. ±×´Â Iprintinterface´Â IUnknown ÀÎÅÍÆäÀ̽º¿¡¼­ Á÷Á¢ ÆÄ»ý µÈ ¶§¹®¿¡ °£´Ü ÇÕ´Ï´Ù. ±×·¯³ª ¸ðµÎ IUnknownÆÄ»ý µÈ µÎ °³ÀÇ ¼­·Î ´Ù¸¥ ÀÎÅÍÆäÀ̽º¸¦ Áö¿ø ÇϰíÀÚ ÇÏ´Â °æ¿ì ´ÙÀ½ »çÇ×À» °í·ÁÇÕ´Ï´Ù

iEditInterface Ŭ·¡½º: °ø¿ë IUnkown
{
°ø°³:
 nbsp;? °¡»ó void EditObject() = 0;
}(&N)

ÀÌ ³ëÆ®°¡ÀÌ ±â´ÉÀ» ±¸Çö ÇÏ´Â ÁßøµÈ Ŭ·¡½º¸¦ »ç¿ë ÇÏ ¿©¿¡ ÁýÁßÇÒ °Í ÀÌ´Ù ºñ·Ï °Å±â¿¡ IEditInterface ¹× c + + ´ÙÁß »ó¼ÓÀ» »ç¿ë ÇÏ ¿© Æ÷ÇÔ ÇÏ´Â IPrintInterface Áö¿ø Ŭ·¡½º¸¦ ±¸Çö ÇÏ´Â ´Ù¸¥ ¹æ¹ýÀÇ ¼ö¡£

cEditPrintObj Ŭ·¡½º
{
°ø°³:
 nbsp;? CEditPrintObj();

HRESULT QueryInterface(REFIID iid, void**);
 ?? ULONG AddRef();
 ?? ULONG Release();
 ?? DWORD m_dwRef;

CPrintObj Ŭ·¡½º: °ø¿ë IPrintInterface
 ?? {
 ?? °ø°³:
 ?????? CEditPrintObj * m_pParent;
 ?????? °¡»ó HRESULT QueryInterface(REFIID iid, void** ppvObj);
 ?????? °¡»ó ULONG AddRef();
 ?????? °¡»ó ULONG Release();
 ?? } m_printObj;

CEditObj Ŭ·¡½º: °ø¿ë IEditInterface
 ?? {
 ?? °ø°³:
 ?????? CEditPrintObj * m_pParent;
 ?????? °¡»ó ULONG QueryInterface(REFIID iid, void** ppvObj);
 ?????? °¡»ó ULONG AddRef();
 ?????? °¡»ó ULONG Release();
 ?? } m_editObj;
}(&N)

Àüü ±¸ÇöÀº ¾Æ·¡¿¡ Æ÷ÇÔ µÇ¾îÀÖ½À´Ï´Ù.:

CEditPrintObj::CEditPrintObj()
{
 nbsp;? m_editObj.m_pParent =ÀÌ;
 ?? m_printObj.m_pParent =ÀÌ;
}

ULONG CEditPrintObj::AddRef() {¹Ýȯ + + m_dwRef;
}

CEditPrintObj::Release()
{
 ?? °æ¿ì (-m_dwRef = = 0)
 ?? {
 ?????? »èÁ¦ÀÌ;
 ?????? 0; ¹Ýȯ
 ?? }
 ?? ¹Ýȯ m_dwRef;
}

HRESULT CEditPrintObj::QueryInterface(REFIID iid, void** ppvObj)
{
 ?? °æ¿ì (iid IID_IUnknown = = | | iid = IID_IPrintInterface)
 ?? {
 ?????? * ppvObj = & m_printObj;
 ?????? AddRef();
 ?????? ¹Ýȯ NOERROR;
 ?? }
 ?? else if (iid = IID_IEditInterface)
 ?? {
 ?????? * ppvObj = & m_editObj;
 ?????? AddRef();
 ?????? ¹Ýȯ NOERROR;
 ?? }
 ?? ¹Ýȯ ResultFromScode(E_NOINTERFACE);
}

ULONG CEditPrintObj::CEditObj::AddRef() {¹Ýȯ m_pParent-> AddRef(); 
}

ULONG CEditPrintObj::CEditObj::Release() {¹Ýȯ m_pParent-> Release(); 
}

HRESULT CEditPrintObj::CEditObj::QueryInterface (
 ?? REFIID iid, void ** ppvObj) {¹Ýȯ m_pParent-> QueryInterface (iid, ppvObj); 
}

ULONG CEditPrintObj::CPrintObj::AddRef() {¹Ýȯ m_pParent-> AddRef(); 
}

ULONG CEditPrintObj::CPrintObj::Release() {¹Ýȯ m_pParent-> Release(); 
}

HRESULT CEditPrintObj::CPrintObj::QueryInterface (
 ?? REFIID iid, void ** ppvObj) {¹Ýȯ m_pParent-> QueryInterface (iid, ppvObj); 
}

´ëºÎºÐÀÇ IUnknown ±¸Çö ¾Ë CEditPrintObj::CEditObj ¹× CEditPrintObj::CPrintObj Äڵ带 º¹Á¦ ÇÏ´Â ´ë½Å CEditPrintObj Ŭ·¡½º¿¡ ¹èÄ¡ µË´Ï´Ù. ÀÌ ÄÚµåÀÇ ¾çÀ» ÁÙÀÌ°í ¹ö±×¸¦ ¹æÁö ÇÕ´Ï´Ù. ÇÙ½É Æ÷ÀÎÆ®´Â ¿©±â IUnknown ÀÎÅÍÆäÀ̽º¿¡¼­ °¡´É ÇÏ´Ù´Â °Í °³Ã¼¸¦ Áö¿øÇÒ ¼ö ÀÖ½À´Ï´Ù, ¸ðµç ÀÎÅÍÆäÀ̽º¸¦ °Ë»ö¿¡ QueryInterface ¸¦ È£Ãâ ÇÏ °í °¢ ÀÎÅÍÆäÀ̽º¿¡¼­ ±×°ÍÀº µ¿ÀÏÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. Áï, °¢ ÀÎÅÍÆäÀ̽º¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸ðµç QueryInterface ÇÔ¼ö Á¤È®È÷ °°Àº ¹æ½ÄÀ¸·Î Çൿ ÇØ¾ß ÇÕ´Ï´Ù. "¿ÜºÎ °³Ã¼" ±¸ÇöÀ» È£Ãâ ÇÏ·Á¸é ÀÌ·¯ÇÑ Æ÷ÇÔ µÈ °³Ã¼¿¡¼­ ´Ù½Ã Æ÷ÀÎÅÍ »ç¿ëµÈ (m_pParent)ÀÔ´Ï´Ù. M_pParent Æ÷ÀÎÅÍ´Â CEditPrintObj »ý¼ºÀÚ´Â µ¿¾È ÃʱâÈ­ µË´Ï´Ù. ´ÙÀ½ CEditPrintObj::CPrintObj::PrintObject ¹× CEditPrintObj::CEditObj::EditObject »Ó¸¸ ±¸ÇöÇÒ °Í ÀÌ´Ù. ¾à°£ ÄÚµåÀÇ Ãß°¡ ±â´É Áß Çϳª¿¡ Ãß°¡ µÇ¾ú½À´Ï´Ù-°³Ã¼¸¦ ÆíÁý ÇÏ´Â ±â´É. ´ÙÇàÈ÷, ±×°ÍÀº (ºñ·Ï ±×°ÍÀº ÀϾ´Ù) ´ÜÀÏ ¸â¹ö ÇÔ¼ö´Â ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ ¸Å¿ì ÀϹÝÀûÀÎ ¹×ÀÌ °æ¿ì EditObject ¹× PrintObject °Í ÀÌ´Ù º¸ÅëÀ¸·Î °áÇÕ µÉ ´ÜÀÏ ÀÎÅÍÆäÀ̽º¡£

±×°ÍÀº ¼³¸íÀÇ ¸¹Àº °£´ÜÇÑ ½Ã³ª¸®¿À¿¡ ´ë ÇÑ Äڵ带 ¸¹ÀÌÀÔ´Ï´Ù. MFC/OLE Ŭ·¡½º´Â °£´ÜÇÑ ´ë¾ÈÀ» Á¦°øÇÕ´Ï´Ù. MFC ±¸Çö ¸Þ½ÃÁö Áöµµ ÇÔ²² Windows ¸Þ½ÃÁö´Â Æ÷Àå ÇÏ´Â ¹æ¹ý¿¡ ºñ½ÁÇÑ ±â¹ýÀ» »ç¿ë ÇÕ´Ï´Ù. ÀÌ ½Ã¼³Àº ÀÎÅÍÆäÀ̽º Áöµµ ¶ó°í ÇÏ¸ç ´ÙÀ½ ¼½¼Ç¿¡¼­ ¼³¸í Çϴ¡£

MFC ÀÎÅÍÆäÀ̽º ¸Ê

MFC/OLE °³³ä ¹× ½ÇÇà "ÀÎÅÍÆäÀ̽º Áöµµ" MFCÀÇ "¸Þ½ÃÁö ¸Ê"¿Í "µð½ºÆÐÄ¡ ¸Ê"¿Í ºñ½ÁÇÑÀÇ ±¸ÇöÀ» Æ÷ÇÔÇÕ´Ï´Ù. MFCÀÇ ÀÎÅÍÆäÀ̽º ÁöµµÀÇ ÇÙ½É ±â´ÉÀº ´ÙÀ½°ú °°½À´Ï´Ù.:

¶ÇÇÑ, ÀÎÅÍÆäÀ̽º ¸ÊÀ» ´ÙÀ½°ú °°Àº °í±Þ ±â´É Áö¿ø:

Áý°è¿¡ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ À¥ »çÀÌÆ®¸¦ ÂüÁ¶ ÇϽʽÿÀ. OLE ÇÁ·Î±×·¡¸Ó¿ë ÂüÁ¶¡£

MFCÀÇ ÀÎÅÍÆäÀ̽º ¸Ê Áö¿ø CCmdTarget Ŭ·¡½º¿¡ »Ñ¸®ÀÔ´Ï´Ù. CCmdTarget "°¡´Â" ¼ö »Ó¸¸ ¾Æ´Ï¶ó IUnknown ±¸Çö (ÂüÁ¶ Ƚ¼ö°¡ ¿¹´Â CCmdTarget)¿Í °ü·Ã µÈ ¸ðµç ¸â¹ö ÇÔ¼ö¸¦ ÂüÁ¶ ÇÕ´Ï´Ù. CCmdTarget ¿¡¼­ ÆÄ»ý Çϴ Ŭ·¡½º ¹× ´Ù¾ç ÇÑ ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© OLE COMÀ» Áö ¿øÇϴ Ŭ·¡½º¸¦ ¸¸µé·Á¸é ¿øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÏ´Â CCmdTarget ÀÇ ¸â¹ö ÇÔ¼ö »Ó¸¸ ¾Æ´Ï¶ó. ÁßøµÈ Ŭ·¡½º¸¦ »ç¿ë ÇÏ ¿© À§ÀÇ ¿¹Á¦ ó·³ °¢ ÀÎÅÍÆäÀ̽º ±¸ÇöÀ» Á¤ÀÇ ÇÏ´Â MFCÀÇ ±¸Çö. ÀÌ ¹Ýº¹ÀûÀÎ ÄÚµå Áß ÀϺθ¦ Á¦°Å ÇÏ´Â ¸ÅÅ©·ÎÀÇ ¼ýÀÚ »Ó¸¸ ¾Æ´Ï¶ó IUnknown Ç¥ÁØ ±¸Çö°ú ½±°Ô ¸¸µé¾î¡£

Áöµµ ±âº» ÀÎÅÍÆäÀ̽º

Áöµµ MFCÀÇ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ë ÇÏ ¿© Ŭ·¡½º¸¦ ±¸Çö ÇÏ·Á¸é ´ÙÀ½ÀÌ ´Ü°è¸¦ µû¸£½Ê½Ã¿À:

  1. Ŭ·¡½º¸¦ Á÷Á¢ ¶Ç´Â °£Á¢ÀûÀ¸·Î ÆÄ»ý CCmdTarget.

  2. DECLARE_INTERFACE_MAP ÇÔ¼ö¸¦ »ç¿ë ÇÏ ¿© ÆÄ»ýµÈ Ŭ·¡½º Á¤ÀÇ¿¡¡£

  3. °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Áö¿ø, BEGIN_INTERFACE_PART ¹× END_INTERFACE_PART ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© Ŭ·¡½º Á¤ÀÇ¿¡ ¿øÇϴ¡£

  4. ±¸Çö ÆÄÀÏ¿¡¼­ BEGIN_INTERFACE_MAP ¹× END_INTERFACE_MAP ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© Ŭ·¡½ºÀÇ ÀÎÅÍÆäÀ̽º ¸Ê Á¤ÀÇ¡£

  5. °¢ IID¸¦ Áö¿ø¿¡ ´ë ÇÑ Æ¯Á¤ "ºÎºÐ" Ŭ·¡½º¿¡ IID¸¦ ¸ÅÇÎÇÒ BEGIN_INTERFACE_MAP ¹× END_INTERFACE_MAP ¸ÅÅ©·Î »çÀÌ INTERFACE_PART ¸ÅÅ©·Î »ç¿ë¡£

  6. °¢°¢ÀÇ Áö¿ø µÇ´Â ÀÎÅÍÆäÀ̽º¸¦ ³ªÅ¸³»´Â ÁßøµÈ Ŭ·¡½º ±¸Çö¡£

  7. METHOD_PROLOGUE ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© ºÎ¸ð, CCmdTarget¾×¼¼½º-ÆÄ»ý °³Ã¼¡£

  8. AddRef, ¸±¸®½º¹× QueryInterface (ExternalAddRef, ExternalRelease¹× ExternalQueryInterface) ÀÌ·¯ÇÑ ÇÔ¼öÀÇ CCmdTarget ±¸Çö¿¡ À§ÀÓÇÒ ¼ö ÀÖ½À´Ï´Ù.

À§ÀÇ CPrintEditObj ¿¹Á¦¿¡¼­´Â ´ÙÀ½°ú °°Àº ±¸Çö µÉ ¼ö ÀÖ½À´Ï´Ù.:

cPrintEditObj Ŭ·¡½º: °ø¿ë CCmdTarget
{
°ø°³:
 nbsp;? / / µ¥ÀÌÅÍ ¸â¹ö ¹× ¸â¹ö ÇÔ¼ö Cprinteditobj¿¡ ´ë ÇÑ °£´Ù

/ / Áöµµ ÀÎÅÍÆäÀ̽º
º¸È£ µÈ:
 ?? DECLARE_INTERFACE_MAP()

BEGIN_INTERFACE_PART (EditObj, IEditInterface)
 ?????? STDMETHOD_ (void, EditObject)();
 ?? END_INTERFACE_PART(EditObj)

BEGIN_INTERFACE_PART (PrintObj, IPrintInterface)
 ?????? STDMETHOD_ (void, PrintObject)();
 ?? END_INTERFACE_PART(PrintObj)
}(&N)

À§ÀÇ ¼±¾ðÀº CCmdTarget¿¡¼­ ÆÄ»ý µÈ Ŭ·¡½º¸¦ ¸¸µì´Ï´Ù. DECLARE_INTERFACE_MAP ¸ÅÅ©·ÎÀÌ Å¬·¡½º´Â »ç¿ëÀÚ ÁöÁ¤ ÀÎÅÍÆäÀ̽º Áöµµ°¡Áö°í °ÍÀÔ´Ï´Ù ÇÁ·¹ÀÓ ¿öÅ©¸¦ ¾Ë·ÁÁÝ´Ï´Ù. ¶ÇÇÑ, BEGIN_INTERFACE_PART ¹× END_INTERFACE_PART ¸ÅÅ©·Î Á¤ÀÇ ÁßøµÈ Ŭ·¡½º,ÀÌ °æ¿ì À̸§ CEditObj ¹× CPrintObj ("C"·Î ½ÃÀÛ ÇÏ´Â Àü¿ª Ŭ·¡½º ¹× "I"·Î ½ÃÀÛ ÇÏ´Â ÀÎÅÍÆäÀ̽º Ŭ·¡½º¿¡¼­ Áßø µÈ Ŭ·¡½º¸¦ Â÷º°È­ ÇÏ´Â µ¥¸¸ »ç¿ë µÇ´Â X)¿Í ÇÔ²². ÀÌ·¯ÇÑ Å¬·¡½ºÀÇ µÎ ¸íÀÇ Áßø µÈ ±¸¼º¿øÀÌ ¸¸µé¾îÁý´Ï´Ù: m_CEditObj, ¹× m_CPrintObj, °¢°¢. ¸ÅÅ©·Î ÀÚµ¿À¸·Î ¼±¾ð AddRef, ¸±¸®½º¹× QueryInterface ÇÔ¼ö; µû¶ó¼­¸¸ ¼±¾ð ÇÔ¼ö¸¦ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ƯÁ¤: EditObject ¹× PrintObject ( STDMETHOD ´Â OLE ¸ÅÅ©·Î »ç¿ë °°Àº _stdcall ¹× °¡»ó Ű¿öµå´Â ´ë»ó Ç÷§Æû¿¡ ¸Â°Ô Á¦°ø)¡£

ÀÌ Å¬·¡½º¿¡ ´ë ÇÑ ÀÎÅÍÆäÀ̽º ¸ÊÀ» ±¸Çö:

BEGIN_INTERFACE_MAP (CPrintEditObj, CCmdTarget)
 nbsp;? INTERFACE_PART (CPrintEditObj, IID_IPrintInterface, PrintObj)
 ?? INTERFACE_PART (CPrintEditObj, IID_IEditInterface, EditObj)
END_INTERFACE_MAP()(&N)

ÀÌ ¿¬°á IID_IPrintInterface IID m_cprintobj¿Í IID_IEditInterface m_CEditObj °¢°¢. CCmdTarget ±¸ÇöÀÇ QueryInterface (CCmdTarget::ExternalQueryInterface)ÀÌÀÌ Áöµµ »ç¿ë ÇÏ ¿© m_CPrintObj ¹× m_CEditObj ¿äû ÇÏ´Â °æ¿ì Æ÷ÀÎÅ͸¦ ¹Ýȯ ÇÕ´Ï´Ù. IID_IUnknown;¿¡ ´ë ÇÑ Ç׸ñÀ» Æ÷ÇÔ ½Ãų ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÇÁ·¹ÀÓ ¿öÅ©´Â (ÀÌ °æ¿ì m_CPrintObj)¿¡ Áöµµ¿¡ ù ¹øÂ° ÀÎÅÍÆäÀ̽º¸¦ »ç¿ë ÇÏ ¿© IID_IUnknown ¿äûÇÑ ¶§¡£

BEGIN_INTERFACE_PART ¸ÅÅ©·Î ÀÚµ¿À¸·Î ´ç½ÅÀ» À§ÇØ AddRef, ¸±¸®½º ¹× QueryInterface ÇÔ¼ö ¼±¾ð, ºñ·Ï ´ç½ÅÀº ¿©ÀüÈ÷ ±×µéÀ» ±¸ÇöÇÒ Çʿ䰡:

ULONG±îÁö ¼öÃâ CEditPrintObj::XEditObj::AddRef()
{
 nbsp;? METHOD_PROLOGUE (CEditPrintObj, EditObj)
 ?? ¹Ýȯ pThis-> ExternalAddRef();
}

ULONG±îÁö ¼öÃâ CEditPrintObj::XEditObj::Release()
{
 ?? METHOD_PROLOGUE (CEditPrintObj, EditObj)
 ?? ¹Ýȯ pThis-> ExternalRelease();
}

HRESULT±îÁö CEditPrintObj::XEditObj::QueryInterface (³»º¸³»±â
 ?? REFIID iid, void ¸Ö¸® * ÈξÀ * ppvObj)
{
 ?? METHOD_PROLOGUE (CEditPrintObj, EditObj)
 ?? ¹Ýȯ (HRESULT) pThis-> ExternalQueryInterface (& iid, ppvObj);
}

void±îÁö ¼öÃâ CEditPrintObj::XEditObj::EditObject()
{
 ?? METHOD_PROLOGUE (CEditPrintObj, EditObj)
 ?? / / ÄÚµå "ÆíÁý" °³Ã¼¸¦ ¾î¶² ÀǹÌ...
}

CEditPrintObj::CPrintObj¿¡ ´ë ÇÑ ±¸Çö Ceditprintobj::ceditobj¿¡ ´ë ÇÑ À§ÀÇ Á¤ÀÇ ºñ½ÁÇÒ °Í ÀÌ´Ù. (»ç½Ç, MFC/OLE °³¹ß ¾ÕºÎºÐ¿¡¼­ÀÌ »ç°Ç À̾ú´Ù) ÀÌ·¯ÇÑ ±â´ÉÀ» ÀÚµ¿À¸·Î »ý¼º ÇÏ´Â µ¥ »ç¿ë µÉ ¼ö ÀÖ´Â ¸ÅÅ©·Î ¸¸µé ¼ö ÀÖÀ» °Í À̶ó°í ÇÏÁö¸¸ ¸ÅÅ©·Î º¸´Ù ÇÑ ÁÙÀÇ Äڵ带 »ý¼ºÇÒ ¶§ ºê·¹ÀÌÅ© Æ÷ÀÎÆ®¸¦ ¼³Á¤ ÇÏ´Â °ÍÀÌ ¾î·Á¿öÁý´Ï´Ù. ÀÌ·±ÀÌ ÀÌÀ¯·Î µé¾î,ÀÌ ÄÚµå´Â ¼öµ¿À¸·Î È®Àå µË´Ï´Ù.

¸Þ½ÃÁöÀÇ ÇÁ·¹ÀÓ ¿öÅ© ±¸ÇöÀ» »ç¿ë ÇÏ ¿© Áöµµ °Å±â´Â ´Ù¾ç ÇÑ °Í µéÀ» ÇÒ Çʿ䰡 µÇÁö ¾Ê¾Ò´Ù:

¶ÇÇÑ, ÇÁ·¹ÀÓ ¿öÅ©´Â ³»ºÎÀûÀ¸·Î ¸Þ½ÃÁö Áöµµ »ç¿ëÇÕ´Ï´Ù. ÀÌ ÇÁ·¹ÀÓ ¿öÅ© Ŭ·¡½º¿¡¼­ ÆÄ»ý Çϸé COleServerDoc, ÀÌ¹Ì Æ¯Á¤ ÀÎÅÍÆäÀ̽º¸¦ Áö¿ø ÇÏ °í ±³Ã¼ ¶Ç´Â Ãß°¡ ÇÁ·¹ÀÓ ¿öÅ©¿¡¼­ Á¦°ø ÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°ø ÇÏ´Â ¸». ÀÌ ÇÁ·¹ÀÓ ¿öÅ©¸¦ ¿Ïº® ÇÏ °Ô Áö¿ø ÀÎÅÍÆäÀ̽º Áöµµ ±âº» Ŭ·¡½º¿¡¼­ »ó¼Ó ÇÏ´Â »ç½Ç¿¡ ÀÇÇØ »ç¿ë-±× ÀÌÀ¯´Â ¿Ö BEGIN_INTERFACE_MAP ÀÇ µÎ ¹øÂ° ¸Å°³ º¯¼ö·Î ±âº» Ŭ·¡½ºÀÇ À̸§¡£

¸Þ¸ðnbsp;??±×°ÍÀº ÀϹÝÀûÀ¸·Î MFCÀÇ OLE ÀÎÅÍÆäÀ̽ºÀÇ ±âº» ±¸ÇöÀº ±¸Çö »ó¼Ó MFC ¹öÀü¿¡¼­ ÇØ´ç ÀÎÅÍÆäÀ̽ºÀÇ ÀÓº£µðµå Àü¹®È­ ÇÏ ¿© ´Ù½Ã »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ ºÒ°¡´É Çϱ⠶§¹®¿¡ Æ÷ÇÔ CCmdTarget¿¡ Á¢±ÙÇÒ METHOD_PROLOGUE ¸ÅÅ©·Î »ç¿ë ÇÏ ¿©-ÆÄ»ýµÈ °³Ã¼ Àǹ̸¦ °íÁ¤ ¿ÀÇÁ¼Â CCmdTarget¿¡¼­ Æ÷ÇÔ µÈ °³Ã¼ÀÇ-°³Ã¼¸¦ ÆÄ»ý ÇÕ´Ï´Ù. Áï, ¿¹¸¦ µé¾î, COleClientItem °³Ã¼ÀÇ À§ÂÊ¿¡¼­ ƯÁ¤ ¿ÀÇÁ¼Â¿¡ ÀÇÁ¸ ÇÏ´Â XAdviseSink ¶§¹®¿¡ Æ÷ÇÔ µÈ Xmyadvisesink¿¡¼­ COleClientItem::XAdviseSink, MFCÀÇ ±¸Çö¿¡¼­ ÆÄ»ý ¼ö ¾ø½À´Ï´Ù(&N).

±×·¯³ª, ¸ðµç MFCÀÇ ±âº» µ¿ÀÛÀ» ¿øÇÏ´Â ÇÔ¼ö¿¡ ´ë ÇÑ MFC ±¸Çö¿¡ À§ÀÓÇÒ ¼ö ÀÖ½À´Ï´Ù. (±×°ÍÀº ¸¹Àº ±â´É¿¡ ´ë ÇÑ m_xoleinplaceuiwindow¿¡ À§ÀÓ) COleFrameHook Ŭ·¡½º¿¡¼­ IOleInPlaceFrame (XOleInPlaceFrame)ÀÇ MFC ±¸Çö¿¡¼­ ÀÌ·ç¾îÁý´Ï´Ù. ÀÌ ¼³°è; ¸¹Àº ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÏ´Â °³Ã¼ÀÇ ·±Å¸ÀÓ Å©±â¸¦ ÁÙÀ̱â À§ÇØ ¼±Åà µÇ¾ú´Ù (°°Àº ¹æ¹ýÀ¸·Î m_pParent ÀÌÀü ¼½¼Ç¿¡¼­ »ç¿ëÇÑ) ¹é Æ÷ÀÎÅÍ¿¡ ´ë ÇÑ Çʿ伺 Á¦°Å¡£

Áý°è ¹× ÀÎÅÍÆäÀ̽º Áöµµ

µ¶¸³ ½ÇÇàÇü COM °³Ã¼ Áö¿ø ¿Ü¿¡ MFC ¶ÇÇÑ Áý°è¸¦ Áö¿ø ÇÕ´Ï´Ù. ÀÚü Áý°è´Â ³Ê¹« º¹Àâ ÇÑ ÁÖÁ¦¸¦ ³íÀÇ ¿©±â; Áý°è¿¡ ´ë ÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº OLE ÇÁ·Î±×·¡¸Ó¿ë ÂüÁ¶ ¸¦ ÂüÁ¶ ÇϽʽÿÀ. ÀÌ ³ëÆ®´Â ´Ü¼øÈ÷ ÇÁ·¹ÀÓ ¿öÅ©¿Í ÀÎÅÍÆäÀ̽º Áöµµ¿¡ ³»Àå µÈ Áý°è¿¡ ´ë ÇÑ Áö¿øÀ» ¼³¸í ÇÕ´Ï´Ù.

Áý°è¸¦ »ç¿ë ÇÏ´Â ¹æ¹ý¿¡ µÎ °¡Áö: (1) Áý°è¸¦ Áö ¿øÇÏ´Â COM °³Ã¼¸¦ »ç¿ë ÇÏ °í (2) ´Ù¸¥ Áý°è µÉ ¼ö ÀÖ´Â °³Ã¼¸¦ ±¸Çö ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±â´ÉÀº "Áý°è °³Ã¼¸¦ »ç¿ë ÇÏ ¿©" ¹× "¸¸µé±â °³Ã¼¸¦ Áý°èÇÒ ¼ö"·Î ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù. MFC ¸ðµÎ Áö¿ø¡£

Áý°è °³Ã¼¸¦ »ç¿ë ÇÏ ¿©

°³Ã¼¸¦ »ç¿ë ÇÏ´Â Áý°è, QueryInterface ¸ÞÄ¿´ÏÁòÀ¸·Î Áý°è ³ØÅ¸ÀÌ ¸î °¡Áö ¹æ¹ýÀÌ ÀÖÀ» °Å±â Çʿ䰡 ÀÖ½À´Ï´Ù. ´Ù¸¥ ¸»·Î Çϸé, Áý°è °³Ã¼´Â °³Ã¼ÀÇ ÀϺÎÀÎ ³×ÀÌÆ¼ºê ó·³ Çൿ ÇØ¾ß ÇÕ´Ï´Ù. ±×·¡¼­ ¾î¶»°Ô MFCÀÇ ÀÎÅÍÆäÀ̽º ¸Ê ¸ÞÄ¿´ÏÁò¿¡ÀÌ ³ØÅ¸ÀÌ Çմϱî? Áßø µÈ °³Ã¼´Â IID¿¡ ¸ÅÇÎµÈ ¾îµð INTERFACE_PART ¸ÅÅ©·Î ¿Ü¿¡ ¶ÇÇÑ CCmdTarget ÆÄ»ý µÈ Ŭ·¡½ºÀÇ ÀϺηΠÁý°è °³Ã¼¸¦ ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é INTERFACE_AGGREGATE ¸ÅÅ©·Î »ç¿ë µË´Ï´Ù. ÀÌ ±â´ÉÀ» »ç¿ë ÇÏ¸é ¸â¹ö º¯¼ö (´Â IUnknown ¿¡ ´ë ÇÑ Æ÷ÀÎÅÍ À̾î¾ß ÇÕ´Ï´Ù ¶Ç´Â ÆÄ»ý Ŭ·¡½º), ÀÎÅÍÆäÀ̽º ¸Ê ¸ÞÄ¿´ÏÁò¿¡ ÅëÇÕ ÇÏ´Â ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. CCmdTarget::ExternalQueryInterface °¡ È£Ãâ µÉ ¶§ Æ÷ÀÎÅ͸¦ NULL ¾ø´Â °æ¿ì ÇÁ·¹ÀÓ ¿öÅ© ÀÚµ¿À¸·Î Áý°è °³Ã¼ÀÇ QueryInterface ¸â¹ö ÇÔ¼ö¸¦ È£Ãâ ÇÏ´Â °ÍÀÔ´Ï´Ù, ±×¸®°í IID ¸¦ ¿äû ÇÏ´Â °æ¿ìÀÌ Áß Çϳª°¡ ¾Æ´Ñ ³×ÀÌÆ¼ºê IIDÀÇ CCmdTarget °³Ã¼ ÀÚü¿¡ ÀÇÇØ Áö¿ø¡£

INTERFACE_AGGREGATE ¸ÅÅ©·Î »ç¿ë ÇÏ·Á¸é ´ÙÀ½ÀÌ ´Ü°è¸¦ ¼öÇà:

  1. Áý°è °³Ã¼¿¡ ´ë ÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔ ÇÏ´Â ¸â¹ö º¯¼ö (´Â IUnknown *) ¼±¾ð¡£

  2. ±ÍÇÏÀÇ ÀÎÅÍÆäÀ̽º ¸Ê¿¡¼­ ¸â¹ö º¯¼ö¸¦ ÂüÁ¶ ÇÏ´Â À̸§À¸·Î INTERFACE_AGGREGATE ¸ÅÅ©·Î Æ÷ÇÔ¡£

  3. (ÀϹÝÀûÀ¸·Î CCmdTarget::OnCreateAggregates) µ¿¾È ¾î¶² ½ÃÁ¡¿¡¼­ NULL ÀÌ¿ÜÀÇ ¸â¹ö º¯¼ö¸¦ ÃʱâÈ­¡£

¿¹¸¦ µé¾î,

cAggrExample Ŭ·¡½º: °ø¿ë CCmdTarget
{
°ø°³:
 nbsp;? CAggrExample();

º¸È£ µÈ:
 ?? LPUNKNOWN m_lpAggrInner;
 ?? °¡»ó BOOL OnCreateAggregates();

DECLARE_INTERFACE_MAP()
 ?? / / "³×ÀÌÆ¼ºê" ÀÎÅÍÆäÀ̽º ºÎºÐ ¸ÅÅ©·Î ¿©±â¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù
};

CAggrExample::CAggrExample()
{
 ?? m_lpAggrInner = NULL;
}

BOOL CAggrExample::OnCreateAggregates()
{
 ?? / / ¿Ã¹Ù¸¥ Á¦¾î ¾ËÀ¸·Î Áý°è ¿¬°á
 ?? m_lpAggrInner (CLSID_Example, Cocreateinstance¸¦ =
 ?????? GetControllingUnknown(), CLSCTX_INPROC_SERVER,
 ?????? IID_IUnknown, (LPVOID *) & m_lpAggrInner);
 ?? °æ¿ì (m_lpAggrInner = = NULL)
 ?????? FALSE; ¹Ýȯ
 ?? / / ¿©±â¿¡ ´Ù¸¥ Áý°è °³Ã¼¸¦ ¼±ÅÃÀûÀ¸·Î ¸¸µé
 ?? TRUE¸¦ ¹Ýȯ ÇÕ´Ï´Ù.
}

BEGIN_INTERFACE_MAP (CAggrExample, CCmdTarget)
 ?? / / ¿©±â¿¡ ¼­ ³×ÀÌÆ¼ºê "INTERFACE_PART" Ç׸ñ
 ?? INTERFACE_AGGREGATE (CAggrExample, m_lpAggrInner)
END_INTERFACE_MAP()

m_lpAggrInner¸¦ NULL·Î »ý¼ºÀÚ¿¡¼­ ÃʱâÈ­ ÇÕ´Ï´Ù. ÇÁ·¹ÀÓ ¿öÅ©´Â QueryInterfaceÀÇ ±âº» ±¸Çö¿¡¼­ NULL ¸â¹ö º¯¼ö¸¦ ¹«½Ã ÇÕ´Ï´Ù. OnCreateAggregates ´Â ½ÇÁ¦·Î Áý°è °³Ã¼¸¦ ¸¸µå´Â °ÍÀÌ ÁÁ½À´Ï´Ù. COleObjectFactoryÀÇ MFC ±¸Çö ¿ÜºÎÀÇ °³Ã¼¸¦ ¸¸µå´Â °æ¿ì¿¡ ¸í½ÃÀûÀ¸·Î È£Ãâ ÇØ¾ß ÇÕ´Ï´Ù. CCmdTarget::GetControllingUnknown ÀÇ »ç¿ë »Ó¸¸ ¾Æ´Ï¶ó CCmdTarget::OnCreateAggregates ¿¡¼­ Áý°è¸¦ ¸¸µå´Â ÀÌÀ¯´Â ¼³¸í Áý°èÇÒ ¼ö °³Ã¼¸¦ ¸¸µé ¶§ ¸í¹éÇÑ µÉ °ÍÀÔ´Ï´Ù.

ÀÌ ±â¼úÀº Áý°è °³Ã¼¿¡¼­ ³×ÀÌÆ¼ºê ÀÎÅÍÆäÀ̽º Ç÷¯½º Áö¿ø ÀÎÅÍÆäÀ̽ºÀÇ ¸ðµç ÇÏ´Â °³Ã¼¸¦ ÁÙ °Í ÀÌ´Ù. Áý°è Áö¿ø ÀÎÅÍÆäÀ̽ºÀÇ ÇÏÀ§ ÁýÇÕ¸¸ ÇÏ·Á´Â °æ¿ì¿¡ CCmdTarget::GetInterfaceHook¸¦ ÀçÁ¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é ¸Å¿ì ³·Àº ¼öÁØÀÇ hookability, QueryInterfaceºñ½ÁÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î, ¿øÇÏ´Â Áý°è¸¦ Áö ¿øÇÏ´Â ¸ðµç ÀÎÅÍÆäÀ̽º¡£

°³Ã¼ ±¸Çö Áý°èÇÒ ¼ö ¸¸µé±â

"Á¦¾î ¾Ë." À§ÀÓ AddRef, ¸±¸®½º¹× QueryInterface ±¸ÇöÀ» ÇØ¾ß ÇÕ´Ï´Ù °³Ã¼¸¦ Áý°èÇÒ ¼ö ¼ö¿¡ ´ë ÇÑ ´Ù¸¥ ¸»·Î Çϸé, °³Ã¼ÀÇ ÀϺΰ¡ µÉ °Í, ±×°ÍÀº À§ÀÓ ÇØ¾ß ÇÕ´Ï´Ù AddRef, ¸±¸®½º¹× QueryInterface ¶ÇÇÑ IUnknown¿¡¼­ ÆÄ»ý µÈ ´Ù¸¥ °³Ã¼¸¦. ÀÌ "Á¦¾î ¾Ë ¼ö"´Â °³Ã¼¸¦ ¸¸µé ¶§, Áï Á¦°ø µË´Ï´Ù COleObjectFactoryÀÇ ±¸Çö¿¡ Á¦°ø ÇÕ´Ï´Ù. ÀÌ ±¸Çö ¿À¹ö ÇìµåÀÇ ÀÛÀº ±Ý¾×À» ¼öÇà ÇÏ °í °æ¿ì¿¡ µû¶ó ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù, ±×·¡¼­ MFC ¼±ÅÃÀûÀÌ °Ô. °³Ã¼ÀÇ »ý¼ºÀÚ¿¡¼­ CCmdTarget::EnableAggregation À» È£Ãâ °³Ã¼¸¦ Áý°èÇÒ ¼ö ÀÖÀ» ¼ö ÀÖµµ·Ï,¡£

°³Ã¼´Â ¶ÇÇÑ Áý°è¸¦ »ç¿ë ÇÏ´Â °æ¿ì ¿Ã¹Ù¸¥ Åë°ú ÇØ¾ß ÇØ¾ß ÇÕ´Ï´Ù ¶ÇÇÑ Áý°è °³Ã¼¸¦ "Á¦¾î ¾Ë". ÀϹÝÀûÀ¸·ÎÀÌ IUnknown Æ÷ÀÎÅÍ´Â Áý°è ¸¸µé¾îÁú ¶§ °³Ã¼¿¡ Àü´Þ µË´Ï´Ù. ¿¹¸¦ µé¾î, pUnkOuter ¸Å°³ º¯¼ö´Â CoCreateInstance¸¦ »ç¿ë ÇÏ ¿© ¸¸µç °³Ã¼¿¡ ´ë ÇÑ "Á¦¾î ¾Ë"ÀÔ´Ï´Ù. ¿Ã¹Ù¸¥ "¾Ë ¼ö ¾ø´Â Á¦¾î" Æ÷ÀÎÅÍ CCmdTarget::GetControllingUnknown¸¦ È£Ãâ ÇÏ ¿© °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ÇØ´ç ÇÔ¼ö¿¡¼­ ¹Ýȯ µÇ´Â °ª À¯È¿ ÇÏÁö »ý¼ºÀÚ Áß. ÀÌ·± ÀÌÀ¯·Î ±×°ÍÀº Á¦¾È CCmdTarget::OnCreateAggregates, ¾îµð GetControllingUnknown ÀÇ ¹Ýȯ °ªÀº COleObjectFactory ±¸Çö¿¡¼­ »ý¼º ÇÏ´Â °æ¿ì¿¡ ½Å·ÚÇÒ ¼ö ÀÖ´Â ÀçÁ¤ÀÇ¿¡ ±ÍÇÏÀÇ Áý°è¸¦ ¸¸µå´Â¡£

±×°Íµµ Áß¿ä °³Ã¼ Ãß°¡ ¶Ç´Â Àΰø ÂüÁ¶ Ƚ¼ö¸¦ ÇØÁ¦ ÇÏ´Â °æ¿ì ¿Ã¹Ù¸¥ ÂüÁ¶ Ƚ¼ö¸¦ Á¶ÀÛ ÇÕ´Ï´Ù. ÀÌ °æ¿ì À§ÇØ Ç×»ó ExternalAddRef ¹× InternalRelease ¹× InternalAddRef´ë½Å ExternalRelease ¸¦ È£Ãâ ÇÕ´Ï´Ù. Áý°è¸¦ Áö ¿øÇϴ Ŭ·¡½º¿¡ InternalRelease ¶Ç´Â InternalAddRef ¸¦ È£Ãâ ÇÏ´Â °Í µÎ ÀÏ ÀÌ´Ù¡£

ÂüÁ¶ ÀÚ·á

OLE °íÀ¯ÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇ Çϰųª OLE ÀÎÅÍÆäÀ̽º ÇÁ·¹ÀÓ ¿öÅ©ÀÇ ±¸ÇöÀ» ÀçÁ¤ÀÇ µîÀÇ °í±Þ »ç¿ë ±âº» ÀÎÅÍÆäÀ̽º ¸Ê ¸ÞÄ¿´ÏÁòÀ» »ç¿ë ÇØ¾ß¡£

ÀÌ ¼½¼Ç¿¡¼­´Â °¢ ¸ÅÅ©·Î ¹× ÀÌ·¯ÇÑ °í±Þ ±â´ÉÀ» ±¸Çö ÇÏ´Â µ¥ »ç¿ë µÇ´Â Api¸¦ ¼³¸í ÇÕ´Ï´Ù.

CCmdTarget::EnableAggregation-ÇÔ¼ö ¼³¸í

void EnableAggregation();

¸Þ¸ðnbsp;??ÀÌ À¯ÇüÀÇ °³Ã¼¿¡ ´ë ÇÑ OLE Áý°è¸¦ Áö¿ø ÇϰíÀÚ ÇÏ´Â °æ¿ì¿¡ ÆÄ»ýµÈ Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡¼­ÀÌ ÇÔ¼ö¸¦ È£Ãâ ÇÕ´Ï´Ù. ÀÌ Áý°èÇÒ ¼ö °³Ã¼¿¡ ÇÊ¿äÇÑ Æ¯º° ÇÑ IUnknown ±¸Çö Áغñ(&N)¡£

CCmdTarget::ExternalQueryInterface-ÇÔ¼ö ¼³¸í

DWORD ExternalQueryInterface (const void ¸Ö¸® * lpIID, LPVOID ¸Ö¸® * ppvObj);

lpIID

IID (QueryInterface ù ¹øÂ° Àμö)¸¦ ¸Ö¸® Æ÷ÀÎÅÍ

ppvObj

¿¡ IUnknown * Æ÷ÀÎÅÍ (µÎ ¹øÂ° Àμö QueryInterface)

¸Þ¸ðnbsp;??ÀÌ ÇÔ¼ö È£ÃâÀÇ IUnknown ±¸Çö¿¡¼­ °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Å¬·¡½º¸¦ ±¸Çö ÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â °³Ã¼ÀÇ ÀÎÅÍÆäÀ̽º ¸ÊÀ» ±â¹ÝÀ¸·Î QueryinterfaceÀÇ Ç¥ÁØ µ¥ÀÌÅÍ ±â¹Ý ±¸ÇöÀ» Á¦°ø ÇÕ´Ï´Ù. ±×°ÍÀº HRESULT ¹Ýȯ °ªÀ» ij½ºÆÃ ÇÏ´Â µ¥ ÇÊ¿äÇÑÀÔ´Ï´Ù. ÀÌ ±â´ÉÀº ·ÎÄà ÀÎÅÍÆäÀ̽º ¸ÊÀ» »ç¿ë ÇÏ´Â ´ë½Å "Á¦¾î IUnknown" È£Ãâ °³Ã¼¸¦ Áý°è ÇÏ´Â °æ¿ì(&N)¡£

CCmdTarget::ExternalAddRef-ÇÔ¼ö ¼³¸í

DWORD ExternalAddRef();

¸Þ¸ðnbsp;??ÀÌ ÇÔ¼ö¸¦ È£Ãâ Iunknown::addrefÀÇ ±¸Çö¿¡¼­ °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Å¬·¡½º¸¦ ±¸Çö ÇÕ´Ï´Ù. ¹Ýȯ °ªÀº CCmdTarget °³Ã¼¿¡ ´ëÇØ »õ ÂüÁ¶ Ƚ¼öÀÔ´Ï´Ù. ÀÌ ±â´ÉÀº ·ÎÄà ÂüÁ¶ Ƚ¼ö¸¦ Á¶ÀÛ ÇÏ´Â ´ë½Å "Á¦¾î IUnknown" È£Ãâ °³Ã¼¸¦ Áý°è ÇÏ´Â °æ¿ì(&N)¡£

CCmdTarget::ExternalRelease-ÇÔ¼ö ¼³¸í

DWORD ExternalRelease();

¸Þ¸ðnbsp;??ÀÌ ÇÔ¼ö¸¦ È£Ãâ Iunknown::releaseÀÇ ±¸Çö¿¡¼­ °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Å¬·¡½º¸¦ ±¸Çö ÇÕ´Ï´Ù. ¹Ýȯ °ªÀº °³Ã¼¿¡ ´ëÇØ »õ ÂüÁ¶ Ƚ¼ö¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ ±â´ÉÀº ·ÎÄà ÂüÁ¶ Ƚ¼ö¸¦ Á¶ÀÛ ÇÏ´Â ´ë½Å "Á¦¾î IUnknown" È£Ãâ °³Ã¼¸¦ Áý°è ÇÏ´Â °æ¿ì(&N)¡£

DECLARE_INTERFACE_MAP-¸ÅÅ©·Î ¼³¸í

DECLARE_INTERFACE_MAP

¸Þ¸ðnbsp;??ÀÌ ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© ÀÎÅÍÆäÀ̽º Áöµµ´Â CCmdTarget ¿¡¼­ ÆÄ»ý µÈ ¸ðµç Ŭ·¡½ºÀÇ. DECLARE_MESSAGE_MAP¿Í °°Àº ¹æ½ÄÀ¸·Î ¸¹ÀÌ »ç¿ë. Ŭ·¡½º Á¤ÀÇ Çì´õ¿¡ ÀϹÝÀûÀ¸·Î¿¡ÀÌ ¸ÅÅ©·Î È£ÃâÀ» ¹èÄ¡ ÇÕ´Ï´Ù (.H) ÆÄÀÏÀÔ´Ï´Ù. DECLARE_INTERFACE_MAP ¸¦ »ç¿ë ÇÏ ¿© Ŭ·¡½º ±¸Çö ÆÄÀÏ¿¡ ÀÎÅÍÆäÀ̽º Áöµµ Á¤ÀÇ ÇØ¾ß ÇÕ´Ï´Ù (.CPP) BEGIN_INTERFACE_MAP ¹× END_INTERFACE_MAP ¸ÅÅ©·Î(&N)¡£

BEGIN_INTERFACE_PART ¹× END_INTERFACE_PART-¸ÅÅ©·Î ¼³¸í

BEGIN_INTERFACE_PART (localClass, iface);

END_INTERFACE_PART (localClass)

localClass

ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö Çϴ Ŭ·¡½ºÀÇ À̸§

iface

ÀÌ Å¬·¡½º¸¦ ±¸Çö ÇÏ´Â ÀÎÅÍÆäÀ̽ºÀÇ À̸§

¸Þ¸ðnbsp;??Ŭ·¡½º´Â ±¸Çö ÇÏ´Â °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ BEGIN_INTERFACE_PART ¹× END_INTERFACE_PART ½ÖÀ»°¡Áö°í ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¸ÅÅ©·Î »Ó¸¸ ¾Æ´Ï¶ó ÇØ´ç Ŭ·¡½ºÀÇ Æ÷ÇÔ µÈ ¸â¹ö º¯¼ö¸¦ Á¤ÀÇ ÇÏ´Â OLE ÀÎÅÍÆäÀ̽º¿¡¼­ ÆÄ»ý µÇ´Â ·ÎÄà Ŭ·¡½º¸¦ Á¤ÀÇ ÇÕ´Ï´Ù. AddRef, ¸±¸®½º¹× QueryInterface ¸â¹ö´Â ÀÚµ¿À¸·Î ¼±¾ð µË´Ï´Ù. ±¸Çö µÇ´Â ÀÎÅÍÆäÀ̽ºÀÇ ÀϺÎÀÎ ´Ù¸¥ ¸â¹ö ÇÔ¼ö¿¡ ´ë ÇÑ ¼±¾ðÀ» Æ÷ÇÔ ÇØ¾ß ÇÕ´Ï´Ù (ÇØ´ç ¼±¾ð BEGIN_INTERFACE_PART ¹× END_INTERFACE_PART ¸ÅÅ©·Î »çÀÌ ¹èÄ¡ µË´Ï´Ù)(&N)¡£

Iface Àμö°¡ IAdviseSink¶Ç´Â IPersistStorage (¶Ç´Â ´ç½ÅÀÇ ÀÚ½ÅÀÇ »ç¿ëÀÚ Á¤ÀÇ ÀÎÅÍÆäÀ̽º)¿Í °°Àº ±¸Çö ÇϰíÀÚ ÇÏ´Â OLE ÀÎÅÍÆäÀ̽º¡£

LocalClass Àμö´Â Á¤ÀÇ µË´Ï´Ù ·ÎÄà Ŭ·¡½ºÀÇ À̸§ÀÔ´Ï´Ù. ' X' ¾Õ ÀÚµ¿À¸·Î À̸§¿¡ Ãß°¡ µË´Ï´Ù. ÀÌ ¸í¸í ±ÔÄ¢Àº µ¿ÀÏÇÑ À̸§ÀÇ Àü¿ª Ŭ·¡½º¿Í Ãæµ¹À» ÇÇÇϱâ À§ÇØ »ç¿ë µË´Ï´Ù. ¶ÇÇÑ, ±×°ÍÀ» Á¦¿Ü ÇÏ °í localClass À̸§¿Í °°Àº Æ÷ÇÔ µÈ ¸â¹öÀÇ À̸§Àº 'm_x'¿¡ ÀÇÇØ Á¢µÎ»ç°¡¡£

¿¹¸¦ µé¾î:

BEGIN_INTERFACE_PART (MyAdviseSink, IAdviseSink)
 nbsp; STDMETHOD_(void,OnDataChange) (LPFORMATETC, LPSTGMEDIUM);
 ? STDMETHOD_(void,OnViewChange) (DWORD, ±ä);
 ? STDMETHOD_(void,OnRename)(LPMONIKER);
 ? STDMETHOD_(void,OnSave)();
 ? STDMETHOD_(void,OnClose)();
END_INTERFACE_PART(MyAdviseSink)(&N)

iAdviseSink¿¡¼­ ÆÄ»ý µÈ XMyAdviseSink ¶ó´Â ·ÎÄà Ŭ·¡½º¸¦ Á¤ÀÇ ÇÏ °í ¼±¾ð Çϴ Ŭ·¡½ºÀÇ ¸â¹ö°¡ È£Ãâ m_xMyAdviseSink.Note:

¸Þ¸ðnbsp;STDMETHOD_ ¿Í ÇÔ²² ½ÃÀÛ ÇÏ´Â ÁÙ¿¡¼­ OLE2 º»ÁúÀûÀ¸·Î º¹»ç µË´Ï´Ù.H¿Í ¾à°£ ¼öÁ¤ ÇÕ´Ï´Ù. Ole2¿¡¼­ ±×µéÀ» º¹»ç ÇÕ´Ï´Ù.H´Â ÇØ°á Çϱ⠾î·Á¿î ¿À·ù¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù(&N).

BEGIN_INTERFACE_MAP ¹× END_INTERFACE_MAP-¸ÅÅ©·Î ¼³¸í

BEGIN_INTERFACE_MAP (Ŭ·¡½º, baseClass)

END_INTERFACE_MAP

Ŭ·¡½º

ÀÎÅÍÆäÀ̽º ¸ÊÀ» Á¤ÀÇ Çϴ Ŭ·¡½º

baseClass

Ŭ·¡½º ¿¡¼­ ÆÄ»ý µÇ´Â Ŭ·¡½º¡£

¼³¸í: BEGIN_INTERFACE_MAP ¹× END_INTERFACE_MAP ¸ÅÅ©·Î ½ÇÁ¦·Î ÀÎÅÍÆäÀ̽º ¸ÊÀ» Á¤ÀÇ ±¸Çö ÆÄÀÏ¿¡ »ç¿ë µË´Ï´Ù. ±¸Çö µÇ´Â °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Çϳª ÀÌ»óÀÇ INTERFACE_PART ¸ÅÅ©·Î È£ÃâÀÔ´Ï´Ù. Ŭ·¡½º¸¦ »ç¿ë ÇÏ ¿© °¢ Áý°è¿¡ ´ë ÇÑ °Å±â¿¡ ÇϳªÀÇ INTERFACE_AGGREGATE ¸ÅÅ©·Î È£Ãâ¡£

INTERFACE_PART-¸ÅÅ©·Î ¼³¸í

INTERFACE_PART (Ŭ·¡½º, iid, localClass)

Ŭ·¡½º

ÀÎÅÍÆäÀ̽º Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ À̸§¡£

iid

IID Æ÷ÇÔµÈ Çϴ Ŭ·¡½º¿¡ ¸ÅÇÎÇÒ ¼ö Àִ¡£

localClass

('X')ÀÌ ·ÎÄà Ŭ·¡½ºÀÇ À̸§

¸Þ¸ðnbsp;??ÀÌ ¸ÅÅ©·Î BEGIN_INTERFACE_MAP ¸ÅÅ©·Î END_INTERFACE_MAP ¸ÅÅ©·Î »çÀÌ °³Ã¼ Áö °¢ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ »ç¿ë µË´Ï´Ù. ÀÖ´Â IID Ŭ·¡½º ¹× localClass¿¡¼­ ÁöÁ¤ µÈ Ŭ·¡½ºÀÇ ¸â¹ö¿¡ ¸ÅÇÎÇÒ ¼ö ÀÖ½À´Ï´Ù. 'M_x' localClass ¿¡ ÀÚµ¿À¸·Î Ãß°¡ µË´Ï´Ù. Âü°í Çϳª ÀÌ»óÀÇ IID ´ÜÀÏ ¸â¹ö¿Í ¿¬°á µÉ ¼ö ÀÖ½À´Ï´Ù. ¸¸ "°¡Àå ÆÄ»ý µÈ" ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÏ´Â ¸ðµç Áß°£ ÀÎÅÍÆäÀ̽º »Ó¸¸ ¾Æ´Ï¶ó Á¦°ø ÇϰíÀÚ ÇÏ´Â °æ¿ì¿¡ ¸Å¿ì À¯¿ë ÇÕ´Ï´Ù. À̰ÍÀÇ ÁÁÀº ¿¹·Î IOleInPlaceFrameWindow ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. °èÃþ ±¸Á¶´Â ´ÙÀ½°ú °°ÀÌ(&N):

IUnknown
 nbsp;? IOleWindow
 ?????? IOleUIWindow
 ?????????? IOleInPlaceFrameWindow(&N)

Ŭ¶óÀÌ¾ðÆ® °³Ã¼ IOleInPlaceFrameWindow¸¦ ±¸Çö ÇÏ´Â °æ¿ì ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º¿¡¼­ QueryInterface µÉ ¼ö ÀÖ½À´Ï´Ù: IOleUIWindow, IOleWindow¶Ç´Â IUnknown"°¡Àå ÆÄ»ýµÈ" ÀÎÅÍÆäÀ̽º IOleInPlaceFrameWindow (½ÇÁ¦·Î ±¸Çö ÇÏ´Â Çϳª) ¿Ü. ÀÌ Ã³¸® ÇÏ·Á¸é IOleInPlaceFrameWindow ÀÎÅÍÆäÀ̽º¸¦ °¢°¢ÀÇ ¸ðµç ±âº» ÀÎÅÍÆäÀ̽º¸¦ ¸ÅÇÎÇÒ Çϳª ÀÌ»óÀÇ INTERFACE_PART ¸ÅÅ©·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

Ŭ·¡½º Á¤ÀÇ ÆÄÀÏ:

BEGIN_INTERFACE_PART (CMyFrameWindow, IOleInPlaceFrameWindow)

Ŭ·¡½º ±¸Çö ÆÄÀÏ¿¡:

BEGIN_INTERFACE_MAP (CMyWnd, CFrameWnd)
 nbsp;? INTERFACE_PART (CMyWnd, IID_IOleWindow, MyFrameWindow)
 ?? INTERFACE_PART (CMyWnd, IID_IOleUIWindow, MyFrameWindow)
 ?? INTERFACE_PART (CMyWnd, IID_IOleInPlaceFrameWindow, MyFrameWindow)
END_INTERFACE_MAP(&N)

±×°ÍÀº Ç×»ó ÇÊ¿ä ÀÌÈÄ ÇÁ·¹ÀÓ ¿öÅ© IunknownÀÇ µ¹¡£

INTERFACE_PART-¸ÅÅ©·Î ¼³¸í

INTERFACE_AGGREGATE (Ŭ·¡½º, theAggr)

Ŭ·¡½º

ÀÎÅÍÆäÀ̽º Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ À̸§,

theAggr

Áý°è ÇÏ´Â ¸â¹ö º¯¼öÀÇ À̸§¡£

¸Þ¸ðnbsp;??ÀÌ ¸ÅÅ©·Î °Ô ÇÁ·¹ÀÓ ¿öÅ© Ŭ·¡½º´Â Áý°è °³Ã¼¸¦ »ç¿ë ÇÏ´Â µ¥ »ç¿ë µË´Ï´Ù. ±×°ÍÀº BEGIN_INTERFACE_PART ¹× END_INTERFACE_PART ¸ÅÅ©·Î »çÀÌ ³ªÅ¸³ª¾ß ÇÕ´Ï´Ù. Áý°è °³Ã¼´Â IUnknown¿¡¼­ ÆÄ»ý µÈ º°µµ °³Ã¼°¡ÀÔ´Ï´Ù. Áý°è¿Í INTERFACE_AGGREGATE ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© Áý°è Áö¿ø ³ªÅ¸³ª´Â °³Ã¼¿¡¼­ Á÷Á¢ Áö¿ø µÇ´Â ¸ðµç ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. TheAggr Àμö´Â ´Ü¼øÈ÷ (Á÷Á¢ ¶Ç´Â °£Á¢ÀûÀ¸·Î) IUnknown ¿¡¼­ ÆÄ»ý µÈ Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö À̸§ÀÔ´Ï´Ù. ¸ðµç INTERFACE_AGGREGATE ¸ÅÅ©·Î INTERFACE_PART ¸ÅÅ©·Î ÀÎÅÍÆäÀ̽º Áöµµ¿¡ ¹èÄ¡ ÇÏ´Â °æ¿ì µû¶ó¾ß ÇÕ´Ï´Ù(&N).

±â¼ú ³ëÆ® ¹øÈ£·Î |nbsp; Ä«Å×°í¸®º° ±â¼ú ³ëÆ®(&N)

Index