TN065: OLE ÀÚµ¿È­ ¼­¹ö¿¡ ÀÌÁß ÀÎÅÍÆäÀ̽º Áö¿ø

ÀÌ ³ëÆ®¿¡¼­´Â MFC ±â¹Ý OLE ÀÚµ¿È­ ¼­¹ö ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÌÁß ÀÎÅÍÆäÀ̽º Áö¿øÀ» Ãß°¡ ÇÏ´Â ¹æ¹ýÀ» ¼³¸í ÇÕ´Ï´Ù. ACDUAL »ùÇÿ¡¼­´Â ÀÌÁß ÀÎÅÍÆäÀ̽º Áö¿ø, ±×¸®°íÀÌ ³ëÆ®¿¡ ¿¹Á¦ ÄÚµå´Â ACDUAL¿¡¼­ °¡Á®¿Â. µîÀÌ ³ëÆ®¿¡ ¼³¸í µÈ ¸ÅÅ©·Î DECLARE_DUAL_ERRORINFO , DUAL_ERRORINFO_PART , ±×¸®°í IMPLEMENT_DUAL_ERRORINFO ACDUAL »ùÇÃÀÇ ÀϺΠÀ̸ç MFCDUAL¿¡¼­ ãÀ» ¼ö ÀÖ½À´Ï´Ù.H¡£

µà¾ó ÀÎÅÍÆäÀ̽º

OLE ÀÚµ¿È­¸¦ »ç¿ë Çϸé IDispatch ÀÎÅÍÆäÀ̽º, VTBL ÀÎÅÍÆäÀ̽º ¶Ç´Â (µÑ ´Ù¸¦ Æ÷ÇÔ) ÇÏ´Â ÀÌÁß ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù, ºñ·Ï ¸ðµç ³ëÃâ µÈ OLE ÀÚµ¿È­ °³Ã¼¿¡ ´ëÇØ ÀÌÁß ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ÀÌÁß ÀÎÅÍÆäÀ̽º´Â IDispatch¿¡ ºñÇØ »ó´çÇÑ ÀÌÁ¡À»-Àü¿ë ¶Ç´Â VTBL Àü¿ë ÀÎÅÍÆäÀ̽º:

CCmdTarget ±â¹Ý Ŭ·¡½º¿¡ ÀÌÁß ÀÎÅÍÆäÀ̽º Áö¿øÀ» Ãß°¡

ÀÌÁß ÀÎÅÍÆäÀ̽º´Â Á¤¸» ±×³É IDispatch¿¡¼­ ÆÄ»ý µÈ »ç¿ëÀÚ ÁöÁ¤ ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. CCmdTarget¿¡ ÀÌÁß ÀÎÅÍÆäÀ̽º Áö¿øÀ» ±¸Çö ÇÏ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº-±â¹ÝµÈ Ŭ·¡½º´Â Á¤»óÀûÀÎ µð½ºÆÐÄ¡ ÀÎÅÍÆäÀ̽º MFC Classwizard¸¦ »ç¿ë ÇÏ ¿© Ŭ·¡½º¿¡ ´ÙÀ½ ³ªÁß¿¡ »ç¿ëÀÚ ÁöÁ¤ ÀÎÅÍÆäÀ̽º¸¦ Ãß°¡ÇÒ Ã¹ ¹øÂ° ±¸ÇöÀÔ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì,¿¡ »ç¿ëÀÚ ÁöÁ¤ ÀÎÅÍÆäÀ̽º ±¸Çö¿¡¼­ ´Ü¼øÈ÷ MFC IDispatch ±¸ÇöÀ» À§ÀÓ µË´Ï´Ù.

ù°, °³Ã¼¿¡ ´ëÇØ ÀÌÁß ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇ ÇÏ ¿© ¼­¹ö¿¡ ´ë ÇÑ ODL ÆÄÀÏÀ» ¼öÁ¤ ÇÕ´Ï´Ù. ÀÌÁß ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇ ÇÏ·Á¸é ´ë½Å ÀÎÅÍÆäÀ̽º ¹®À» »ç¿ë ÇÕ´Ï´Ù DISPINTERFACE Visual c + + ¸¶¹ý»ç »ý¼º ÇÏ´Â ¹®. ±âÁ¸ÀÇ Á¦°Å ÇÏ´Â ´ë½Å DISPINTERFACE ¹®, »õ·Î¿î ÀÎÅÍÆäÀ̽º ¹®À» Ãß°¡ ÇÕ´Ï´Ù. À¯Áö´Â DISPINTERFACE ¾ç½Ä, Classwizard¸¦ »ç¿ë ÇÏ ¿© °³Ã¼, ¼Ó¼º ¹× ¸Þ¼­µå Ãß°¡¸¦ °è¼ÓÇÒ ¼ö ÀÖ½À´Ï´Ù ÇÏÁö¸¸ ÀÎÅÍÆäÀ̽º ¹®À» ÇØ´ç ¼Ó¼º ¹× ¸Þ¼­µå¸¦ Ãß°¡ ÇØ¾ß ÇÕ´Ï´Ù¡£

ÀÌÁß ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ ÀÎÅÍÆäÀ̽º ¹®À» OLEAUTOMATION ¹× µà¾ó Ư¼ºÀ»°¡Áö°í ÀÖ¾î¾ß ÇÕ´Ï´Ù ±×¸®°í ÀÎÅÍÆäÀ̽º´Â IDispatch¿¡¼­ ÆÄ»ý µÇ¾î¾ß ÇÕ´Ï´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â µà¾ó ÀÎÅÍÆäÀ̽ºÀÇ IID ¸¦ ¸¸µé·Á°í GUIDGEN »ùÇÃ

[uuid(0BDD0E81-0DD7-11cf-BBA8-444553540000), / / IID_IDualAClick
 nbsp; oleautomation,
 ? µà¾ó
]
IDualAClick ÀÎÅÍÆäÀ̽º: IDispatch
  {
  }(&N)

ÀÏ´Ü ´ç½ÅÀÌ Àå¼Ò¿¡¼­ ÀÎÅÍÆäÀ̽º ¹®À» ¸Þ¼­µå ¹× ¼Ó¼º¿¡ ´ë ÇÑ Ç׸ñ Ãß°¡ ½ÃÀÛ ÇÕ´Ï´Ù. ÀÌÁß ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ ¸Þ¼­µå ¹× ¼Ó¼º Á¢±ÙÀÚ ÇÔ¼ö µà¾ó ÀÎÅÍÆäÀ̽º¿¡¼­ HRESULT ¸¦ ¹Ýȯ ÇÏ °í Ư¼º ¸Å°³ º¯¼ö·Î ¹Ýȯ °ªÀ» Àü´ÞÇÒ ¸Å°³ º¯¼ö ¸ñ·ÏÀ» ´Ù½Ã Á¤·Ä ÇØ¾ß [retval,out] . ¼Ó¼º ¸ðµÎ Àб⸦ Ãß°¡ ÇÏ·Á¸é ÇÊ¿ä °Í ÀÌ´Ù ( propget ) ¹× ¾²±â ( propput ) µ¿ÀÏÇÑ id °¡Áø ÇÔ¼ö¿¡ ¾×¼¼½º ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î:

[propput, id(1)] HRESULT (ÅØ½ºÆ® [] BSTR newText);
[propget, id(1)] HRESULT ÅØ½ºÆ® ([out, retval] BSTR * retval)

¼Ó¼º°ú ¸Þ¼­µå¸¦ Á¤ÀÇÇÑ ÈÄ¿¡ coclass ¹®¿¡ ÀÎÅÍÆäÀ̽º ¹®¿¡ ´ë ÇÑ ÂüÁ¶¸¦ Ãß°¡ ÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î:

[uuid(4B115281-32F0-11cf-AC85-444553540000)]
coclass ¹®¼­
{
 nbsp; dispinterface IAClick;
 ? [±âº»°ª] ÀÎÅÍÆäÀ̽º IDualAClick;
}(&N)

ODL ÆÄÀÏÀ» ¾÷µ¥ÀÌÆ® ÇÏ´Â ÀÏ´Ü °³Ã¼ Ŭ·¡½º¿¡¼­ ÀÌÁß ÀÎÅÍÆäÀ̽ºÀÇ ±¸Çö Ŭ·¡½º¸¦ Á¤ÀÇ ÇÏ °í MFCÀÇ QueryInterface ¸ÞÄ¿´ÏÁò¿¡ ÇØ´ç Ç׸ñÀ» È®ÀÎ ÇÏ·Á¸é MFCÀÇ ÀÎÅÍÆäÀ̽º ¸Ê ¸ÞÄ¿´ÏÁòÀ» »ç¿ë ÇÕ´Ï´Ù. ÇÑ Ç׸ñ¿¡ ÇÊ¿ä ÇÕ´Ï´Ù INTERFACE_PART ODL, ÀÎÅÍÆäÀ̽º ¹®¿¡¼­ °¢ Ç׸ñÀ» ´õÇϱ⸦ µð½ºÆÐÄ¡ ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Ç׸ñ¿¡ ´ë ÇÑ ºí·Ï. Propput Ư¼ºÀ» °¡Áø °¢ ODL Ç׸ñ ¶ó´Â ÇÔ¼ö°¡ ÇÊ¿ä put_propertyname . Propget Ư¼ºÀ» °¡Áø °¢ Ç׸ñ ÇÊ¿ä ¶ó´Â ÇÔ¼öget_propertyname¡£

ÀÌÁß ÀÎÅÍÆäÀ̽ºÀÇ ±¸Çö Ŭ·¡½º¸¦ Á¤ÀÇ ÇÏ·Á¸é Ãß°¡ DUAL_INTERFACE_PART °³Ã¼ Ŭ·¡½º Á¤ÀÇ¿¡ ºí·Ï. ¿¹¸¦ µé¾î:

BEGIN_DUAL_INTERFACE_PART (DualAClick, IDualAClick)
  STDMETHOD(put_text) (THIS_ BSTR newText);
  STDMETHOD(get_text) (THIS_ BSTR ¸Ö¸® * retval);
  STDMETHOD(put_x) (THIS_ ªÀº newX);
  STDMETHOD(get_x) (THIS_ ªÀº ¸Ö¸® * retval);
  STDMETHOD(put_y) (THIS_ ªÀº newY);
  STDMETHOD(get_y) (THIS_ ªÀº ¸Ö¸® * retval);
  STDMETHOD(put_Position) (THIS_ IDualAutoClickPoint ¸Ö¸® * newPosition);
  STDMETHOD(get_Position) (THIS_ IDualAutoClickPoint ¸Ö¸® * ÈξÀ * retval);
  STDMETHOD(RefreshWindow)(THIS);
  STDMETHOD(SetAllProps) (THIS_ ªÀº x, ªÀº y, BSTR ÅØ½ºÆ®);
  STDMETHOD(ShowWindow)(THIS);
END_DUAL_INTERFACE_PART(DualAClick)

MfcÀÇ ÀÌÁß ÀÎÅÍÆäÀ̽º¸¦ ¿¬°á ÇÏ·Á¸é QueryInterface ¸ÞÄ¿´ÏÁò Ãß°¡ INTERFACE_PART ÀÎÅÍÆäÀ̽º ¸Ê Ç׸ñ

BEGIN_INTERFACE_MAP (CAutoClickDoc, CDocument)
  INTERFACE_PART (CAutoClickDoc, DIID_IAClick, ÆÄ°ß)
  INTERFACE_PART (CAutoClickDoc, IID_IDualAClick, DualAClick)
END_INTERFACE_MAP()

´ÙÀ½À¸·Î, ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀ» ÀÛ¼º ÇØ¾ß ÇÕ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì, ±âÁ¸ MFC IDispatch ±¸Çö¿¡ À§ÀÓÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î:

STDMETHODIMP_(ULONG) CAutoClickDoc::XDualAClick::AddRef()
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   return pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CAutoClickDoc::XDualAClick::Release()
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   return pThis->ExternalRelease();
}
STDMETHODIMP CAutoClickDoc::XDualAClick::QueryInterface(
             REFIID iid, LPVOID* ppvObj)
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   return pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP CAutoClickDoc::XDualAClick::GetTypeInfoCount(
            UINT FAR* pctinfo)
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE);
   ASSERT(lpDispatch != NULL);
   return lpDispatch->GetTypeInfoCount(pctinfo);
}
STDMETHODIMP CAutoClickDoc::XDualAClick::GetTypeInfo(
          UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE);
   ASSERT(lpDispatch != NULL);
   return lpDispatch->GetTypeInfo(itinfo, lcid, pptinfo);
}
STDMETHODIMP CAutoClickDoc::XDualAClick::GetIDsOfNames(
       REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames,
       LCID lcid, DISPID FAR* rgdispid) 
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE);
   ASSERT(lpDispatch != NULL);
   return lpDispatch->GetIDsOfNames(riid, rgszNames, cNames, 
                                    lcid, rgdispid);
}
STDMETHODIMP CAutoClickDoc::XDualAClick::Invoke(
    DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
    DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult,
    EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr)
{
   METHOD_PROLOGUE(CAutoClickDoc, DualAClick)
   LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE);
   ASSERT(lpDispatch != NULL);
   return lpDispatch->Invoke(dispidMember, riid, lcid,
                             wFlags, pdispparams, pvarResult,
                             pexcepinfo, puArgErr);
}

°³Ã¼ÀÇ ¸Þ¼­µå ¹× ¼Ó¼º Á¢±ÙÀÚ ÇÔ¼ö¿¡ ´ëÇØ ±¸ÇöÀ» ÀÛ¼º ÇØ¾ß ÇÕ´Ï´Ù. ¸Þ¼­µå ¹× ¼Ó¼º ÇÔ¼ö ¸¶¹ý»ç¸¦ »ç¿ë ÇÏ ¿© »ý¼º ÇÏ´Â ¹æ¹ý¿¡ ´Ù½Ã ÀϹÝÀûÀ¸·Î À§ÀÓÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª, º¯¼ö¿¡ Á÷Á¢ ¾×¼¼½º ¼Ó¼ºÀ» ¼³Á¤ ÇÏ´Â °æ¿ì¿¡ get/put º¯¼öÀÇ °ªÀ¸·Î´Â Äڵ带 ÀÛ¼º ÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î:

STDMETHODIMP CAutoClickDoc::XDualAClick::put_text(BSTR newText)
{
 nbsp; METHOD_PROLOGUE (CAutoClickDoc, DualAClick)
 ? / / MFC À¯´ÏÄÚµå BSTR¸¦¿¡¼­ ÀÚµ¿À¸·Î º¯È¯ / / Ansi CString, ÇÊ¿äÇÑ °æ¿ì...
 ? pThis-> m_str newText; =
 ? ¹Ýȯ NOERROR;
}
STDMETHODIMP CAutoClickDoc::XDualAClick::get_text(BSTR* retval)
{
 ? METHOD_PROLOGUE (CAutoClickDoc, DualAClick)
 ? / / MFC ÀÚµ¿À¸·Î Ansi Cstring¿¡¼­ º¯È¯ / / À¯´ÏÄÚµå BSTR, ÇÊ¿äÇÑ °æ¿ì...
 ? pThis-> m_str.SetSysString(retval);
 ? ¹Ýȯ NOERROR;
}

ÀÌÁß ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ Àü´Þ

ÀÌÁß ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ Àü´Þ CCmdTarget::FromIDispatch¸¦ È£Ãâ ÇØ¾ß ÇÏ´Â °æ¿ì¿¡ ƯÈ÷ ¸¸µé±â¶õ ½±Áö ¾Ê½À´Ï´Ù. FromIDispatch ´Â MFCÀÇ IDispatch Æ÷ÀÎÅÍ ¿¡¼­¸¸ ÀÛµ¿ÇÕ´Ï´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°á ÇÏ´Â ¹æ¹ý Áß Çϳª´Â ¿ø·¡ IDispatch Æ÷ÀÎÅÍ ÁýÇÕ MFC¿¡ ÀÇÇØ À§·Î ±×°Í ÇÊ¿ä·Î ÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ Àü´Þ¿¡ ´ë ÇÑ Äõ¸®. ¿¹¸¦ µé¾î

 STDMETHODIMP CAutoClickDoc::XDualAClick::put_Position (
 nbsp;??? IDualAutoClickPoint ±Øµ¿ * newPosition)
{
 ? METHOD_PROLOGUE (CAutoClickDoc, DualAClick)
 ? LPDISPATCH lpDisp = NULL;
 ? newPosition-> QueryInterface (IID_IDispatch, (LPVOID *) & lpDisp);
 ? pThis-> SetPosition(lpDisp);
 ? lpDisp-> Release();
 ? ¹Ýȯ NOERROR;
}

ÀÌÁß ÀÎÅÍÆäÀ̽º ¸Þ¼­µå¸¦ ÅëÇØ ´Ù½Ã Æ÷ÀÎÅ͸¦ Àü´Þ Çϱâ Àü¿¡ µà¾ó ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ MFC IDispatch Æ÷ÀÎÅÍ¿¡¼­ º¯È¯ ÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î:

STDMETHODIMP CAutoClickDoc::XDualAClick::get_Position (
 nbsp;??? IDualAutoClickPoint ±Øµ¿ * ÈξÀ * retval)
{
 ? METHOD_PROLOGUE (CAutoClickDoc, DualAClick)
 ? LPDISPATCH lpDisp;
 ? lpDisp = pThis-> GetPosition();
 ? lpDisp-> QueryInterface (IID_IDualAutoClickPoint, (LPVOID *) retval);
 ? ¹Ýȯ NOERROR;
}

ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çü½Ä ¶óÀ̺귯¸® µî·Ï

AppWizard OLE ÀÚµ¿È­ ¼­¹ö ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çü½Ä ¶óÀ̺귯¸®¸¦ ½Ã½ºÅÛ¿¡ µî·Ï ÇÏ´Â Äڵ带 »ý¼º ÇÏÁö ¾Ê½À´Ï´Ù. Çü½Ä ¶óÀ̺귯¸®¸¦ µî·Ï ÇÏ´Â ´Ù¸¥ ¹æ¹ý ±×·¯³ª ±×°ÍÀº ±×°Í ¾÷µ¥ÀÌÆ®´Â OLE Çü½Ä Á¤º¸ Áï, µ¶¸³ ½ÇÇàÇü ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÉ ¶§¸¶´Ù ¶§ Çü½Ä ¶óÀ̺귯¸®¸¦ µî·Ï ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥À» Æí¸® ÇÏ °Ô¡£

µ¶¸³ ½ÇÇàÇü ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÉ ¶§¸¶´Ù ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çü½Ä ¶óÀ̺귯¸®¸¦ µî·Ï ÇÏ·Á¸é:

Çü½Ä ¶óÀ̺귯¸® º¯°æ ³»¿ë¿¡ ¸Â°Ô ÇÁ·ÎÁ§Æ® ºôµå ¼³Á¤ ¼öÁ¤

¼öÁ¤ ÇÁ·ÎÁ§Æ®ÀÇ ºôµå ¼³Á¤À» UUID Á¤Àǰ¡ Æ÷ÇÔ µÈ Çì´õ ÆÄÀÏ¿¡ ÀÇÇØ »ý¼º µÇ´Â MkTypLib Çü½Ä ¶óÀ̺귯¸®¸¦ ´Ù½Ã ÀÛ¼º ÇÏ´Â ¶§¸¶´Ù

  1. ºôµå ¸Þ´º¿¡¼­ ¼³Á¤À» Ŭ¸¯ ODL ÆÄÀÏ¿¡¼­ °¢ ±¸¼º¿¡ ´ë ÇÑ ÆÄÀÏ ¸ñ·Ï¡£

  2. OLE Çü½Ä ÅÇÀ» Ŭ¸¯ ÇÏ °í Ãâ·Â Çì´õ ÆÄÀÏ À̸§ Çʵ忡 ÆÄÀÏ À̸§À» ÁöÁ¤ ÇÕ´Ï´Ù. »ç¿ë µÇÁö ¾Ê´Â ÀÌ¹Ì ÇÁ·ÎÁ§Æ®¿¡ ÀÇÇØ ÀÌÈÄ MkTypLib ¸ðµç ±âÁ¸ ÆÄÀÏÀ» µ¤¾î¾¹´Ï´Ù ÆÄÀÏ À̸§À» »ç¿ë ÇÕ´Ï´Ù. ºôµå ¼³Á¤ ´ëÈ­ »óÀÚ¸¦ ´ÝÀ¸·Á¸é È®ÀÎÀ» Ŭ¸¯ÇÕ´Ï´Ù¡£

MkTypLib »ý¼º µÈ Çì´õ ÆÄÀÏÀÇ UUID Á¤ÀÇ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ ÇÏ·Á¸é:

  1. MkTypLib »ý¼ºÀ» Æ÷ÇÔ ±ÍÇÏÀÇ Ç¥ÁØ Çì´õ ÆÄÀÏ¿¡ Çì´õ ÆÄÀÏ, STDAFX Æ÷ÇÔ µÇ¾î ÀÖ½À´Ï´Ù.H¡£

  2. INITIIDS »õ ÆÄÀÏÀ» ¸¸µì´Ï´Ù.CPP, ±ÍÇÏÀÇ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ ÇÕ´Ï´Ù. ÀÌ ÆÄÀÏ¿¡¼­ Æ÷ÇÔ OLE2 ÈÄ MkTypLib »ý¼º µÈ Çì´õ ÆÄÀÏÀ» Æ÷ÇÔ ÇÕ´Ï´Ù.H ¹× INITGUIDÀÔ´Ï´Ù.H:
    / / initIIDs.c: µà¾ó ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Iid¸¦ Á¤ÀÇ
    / /ÀÌ ¹Ì¸® ÄÄÆÄÀÏµÈ Çì´õ¿Í ÇÔ²² ³»Àå µÇÁö ÇØ¾ß ÇÕ´Ï´Ù.
      # include lt;ole2.h >
      # include <initguid.h>
      # include "acdual.h"
    
  3. ºôµå ¸Þ´º¿¡¼­ ¼³Á¤À» Ŭ¸¯ ÇÑ ´ÙÀ½ INITIIDS¸¦ ¼±Åà ÇÕ´Ï´Ù.°¢ ±¸¼º¿¡ ´ë ÇÑ ÆÄÀÏ ¸ñ·Ï¿¡¼­ CPP¡£

  4. Ä«Å×°í¸® "¹Ì¸® ÄÄÆÄÀÏµÈ Çì´õ" °í ¹Ì¸® ¼±Åà ÇÕ´Ï´Ù "»ç¿ë ÇÏÁö ¾Ê´Â ÄÄÆÄÀÏµÈ Çì´õ" ¶óµð¿À ´ÜÃß, c + + ÅÇÀ» Ŭ¸¯ ÇÕ´Ï´Ù. ºôµå ¼³Á¤ ´ëÈ­ »óÀÚ¸¦ ´ÝÀ¸·Á¸é È®ÀÎÀ» Ŭ¸¯ÇÕ´Ï´Ù¡£

Çü½Ä ¶óÀ̺귯¸®¿¡¼­ ¿Ã¹Ù¸¥ °³Ã¼ Ŭ·¡½º À̸§ ÁöÁ¤

Visual c + +¿Í ÇÔ²² Á¦°ø ¿Ã¹Ù¸£°Ô ¸¶¹ý»ç ±¸Çö Ŭ·¡½º À̸§À» »ç¿ë ÇÏ ¿© OLE ÇÒ±î¿ä Ŭ·¡½º¿¡ ´ë ÇÑ ¼­¹öÀÇ ODL ÆÄÀÏ¿¡¼­ coclass¸¦ ÁöÁ¤ ÇÕ´Ï´Ù. ÀÌ ÀÛµ¿ ÇÏ´Â µ¿¾È ±¸Çö Ŭ·¡½º À̸§Àº ¾Æ¸¶ °³Ã¼ÀÇ »ç¿ëÀÚ°¡ »ç¿ë ÇÏ·Á¸é Ŭ·¡½º À̸§ÀÌÀÔ´Ï´Ù. ¿Ã¹Ù¸¥ À̸§À» ÁöÁ¤ ÇÏ·Á¸é ODL ÆÄÀÏÀ» ¿­°í ÇÏ °í ãÀº °¢ coclass ¹®¿¡ ±¸Çö Ŭ·¡½º À̸§À» ¿Ã¹Ù¸¥ ¿ÜºÎ À̸§À¸·Î ¹Ù²ß´Ï´Ù¡£

Note´Â coclass ¹®À» º¯°æ ÇÏ´Â ¶§ CLSIDs MkTypLib »ý¼º µÈ Çì´õ ÆÄÀÏ¿¡¼­ º¯¼ö À̸§À» µû¶ó º¯°æ µË´Ï´Ù. »õ º¯¼ö À̸§À» »ç¿ë ÇÏ´Â Äڵ带 ¾÷µ¥ÀÌ Æ® ÇØ¾ß¡£

¿¹¿Ü ¹× ÀÚµ¿È­ ¿À·ù ÀÎÅÍÆäÀ̽º ó¸®

ÀÚµ¿È­ °³Ã¼ÀÇ ¸Þ¼­µå ¹× ¼Ó¼º Á¢±ÙÀÚ ÇÔ¼ö´Â ¿¹¿Ü¸¦ throw µÉ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ±×·¸´Ù¸é, ÀÌÁß ÀÎÅÍÆäÀ̽º ±¸Çö¿¡¼­ ó¸® ÇÏ °í ÄÁÆ®·Ñ·¯ IErrorInfoOLE ÀÚµ¿È­ ¿À·ù ó¸® ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ¿¹¿Ü¿¡ ´ë ÇÑ Á¤º¸¸¦ Àü´Þ ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â IDispatch ¿Í VTBL ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ »ó¼¼ÇÑ, »óȲº° ¿À·ù Á¤º¸¸¦ Á¦°øÇÕ´Ï´Ù. ¿À·ù 󸮱⸦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ ³ªÅ¸³»·Á¸é ISupportErrorInfo ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇØ¾ß ÇÕ´Ï´Ù.

¿À·ù ó¸® ¸ÞÄ¿´ÏÁòÀ» ¼³¸í Çϴ ǥÁØ µð½ºÆÐÄ¡ Áö¿øÀ» ±¸Çö ÇÏ´Â µ¥ »ç¿ë ÇÏ´Â ClassWizard »ý¼º ÇÔ¼ö ¿¹¿Ü¸¦ throw ÇÏ´Â °¡Á¤ ÇÕ´Ï´Ù. IDispatch::Invoke ÀÇ MFCÀÇ ±¸ÇöÀº ÀϹÝÀûÀ¸·Î ÀÌ·¯ÇÑ ¿¹¿Ü¸¦ Æ÷Âø ÇÏ °í Invoke È£ÃâÀ» ÅëÇØ ¹Ýȯ µÇ´Â º¯È¯ ÇÏ´Â EXCEPTINFO ±¸Á¶Ã¼ÀÔ´Ï´Ù. ±×·¯³ª VTBL ÀÎÅÍÆäÀ̽º¸¦ »ç¿ë ÇÏ´Â °æ¿ì ÀÖ½À´Ï´Ù ÇØ´ç ¿¹¿Ü¸¦ catch ÇÏ´Â ÀÛ¾÷À» ´ã´ç ÇÕ´Ï´Ù. º¸È£ ÇÏ´Â ÀÌÁß ÀÎÅÍÆäÀ̽º ¹æ¹ýÀÇ ¿¹

STDMETHODIMP CAutoClickDoc::XDualAClick::put_text(BSTR newText)
{
 nbsp; METHOD_PROLOGUE (CAutoClickDoc, DualAClick)
 ? TRY_DUAL(IID_IDualAClick)
 ? {
 ???? / / MFC À¯´ÏÄÚµå BSTR¸¦¿¡¼­ ÀÚµ¿À¸·Î º¯È¯ / / Ansi CString, ÇÊ¿äÇÑ °æ¿ì...
 ???? pThis-> m_str newText; =
 ???? ¹Ýȯ NOERROR;
 ? }
 ? CATCH_ALL_DUAL
}

CATCH_ALL_DUAL¿¹¿Ü°¡ ¹ß»ý ÇÏ´Â °æ¿ì ¿Ã¹Ù¸¥ ¿À·ù Äڵ带 ¹Ýȯ ó¸® ÇÕ´Ï´Ù. CATCH_ALL_DUAL´Â MFC ¿¹¿Ü ICreateErrorInfo ÀÎÅÍÆäÀ̽º¸¦ »ç¿ë ÇÏ ¿© OLE ÀÚµ¿È­ ¿À·ù ó¸® Á¤º¸·Î º¯È¯ ÇÕ´Ï´Ù. (¿¹¸¦ µé¾î CATCH_ALL_DUAL ¸ÅÅ©·Î MFCDUAL ÆÄÀÏ¿¡ ÀÖ½À´Ï´Ù.H´Â ACDUAL »ùÇÃ. ¿¹¿Ü¸¦ ó¸® È£Ãâ ÇÏ´Â ÇÔ¼ö¸¦ DualHandleException , MFCDUAL ÆÄÀÏ¿¡ ÀÖ½À´Ï´Ù.CPPÀÔ´Ï´Ù.) CATCH_ALL_DUAL¿À·ù Äڵ尡 ¹ß»ý ÇÑ ¿¹¿Ü Çü½Ä¿¡ µû¶ó ¹Ýȯ °áÁ¤

OLE ÀÚµ¿È­ ¿À·ù 󸮱⸦ »ç¿ë ÇÏ´Â °ÍÀ» ³ªÅ¸³»·Á¸é ¶ÇÇÑ ISupportErrorInfo ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇØ¾ß¡£

ù°, ÄÚµå ISupportErrorInfo ¸¦ Áö ¿øÇϴ ǥ½Ã ÀÚµ¿È­ Ŭ·¡½º Á¤ÀǸ¦ Ãß°¡ÇÕ´Ï´Ù¡£

µÑ°, ISupportErrorInfo ±¸Çö Ŭ·¡½º¸¦ MFCÀÇ QueryInterface ¸ÞÄ¿´ÏÁò ¿¬°ü ÀÚµ¿È­ Ŭ·¡½ºÀÇ ÀÎÅÍÆäÀ̽º Áöµµ¿¡ Äڵ带 Ãß°¡ ÇÕ´Ï´Ù. INTERFACE_PART¹®À» ÀÏÄ¡ ISupportErrorInfo ¿¡ ´ëÇØ Á¤ÀÇ Çϴ Ŭ·¡½º¡£

ISupportErrorInfo ¸¦ Áö¿ø Çϱâ À§ÇØ Á¤ÀÇ Çϴ Ŭ·¡½º¸¦ ±¸Çö ÇÏ´Â ¸¶Áö¸·À¸·Î,¡£

(ÇÕ´Ï´Ù ÀÌ·¯ÇÑ ¼¼ ´Ü°è¸¦ ¼öÇà ÇÏ´Â µ¥ ¼¼ °¡Áö ¸ÅÅ©·Î Æ÷ÇÔ ÇÏ´Â ACDUAL »ùÇà DECLARE_DUAL_ERRORINFO , DUAL_ERRORINFO_PART , ¹× IMPLEMENT_DUAL_ERRORINFO , ¸ðµç MFCDUAL¿¡ Æ÷ÇÔ µÈ.H.)

´ÙÀ½ ¿¹Á¦¿¡¼­´Â ISupportErrorInfo¸¦ Áö¿ø Çϱâ À§ÇØ Á¤ÀÇ Çϴ Ŭ·¡½º¸¦ ±¸Çö ÇÕ´Ï´Ù. CAutoClickDocÀÚµ¿È­ Ŭ·¡½ºÀÇ À̸§ÀÔ´Ï´Ù ¹× IID_IDualAClick OLE ÀÚµ¿È­ ¿À·ù °³Ã¼¸¦ ÅëÇØ º¸°í µÈ ¿À·ù ¼Ò½º ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ IID:

STDMETHODIMP_(ULONG) CAutoClickDoc::XSupportErrorInfo::AddRef() {
 nbsp; METHOD_PROLOGUE (CAutoClickDoc, SupportErrorInfo) ¹Ýȯ pThis-> ExternalAddRef(); 
} STDMETHODIMP_(ULONG) CAutoClickDoc::XSupportErrorInfo::Release() {METHOD_PROLOGUE (CAutoClickDoc, SupportErrorInfo) ¹Ýȯ pThis-> ExternalRelease(); 
} STDMETHODIMP CAutoClickDoc::XSupportErrorInfo::QueryInterface (REFIID iid, LPVOID * ppvObj) {METHOD_PROLOGUE (CAutoClickDoc, SupportErrorInfo) ¹Ýȯ pThis-> ExternalQueryInterface (& iid, ppvObj); 
} STDMETHODIMP CAutoClickDoc::XSupportErrorInfo::InterfaceSupportsErrorInfo (REFIID iid) {METHOD_PROLOGUE (CAutoClickDoc, SupportErrorInfo) ¹Ýȯ (iid IID_IDualAClick =)? S_OK: S_FALSE¸¦ ¹Ýȯ; 
}

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

Index