ÀÌ ³ëÆ®¿¡¼´Â 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 Çü½Ä Á¤º¸ Áï, µ¶¸³ ½ÇÇàÇü ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÉ ¶§¸¶´Ù ¶§ Çü½Ä ¶óÀ̺귯¸®¸¦ µî·Ï ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥À» Æí¸® ÇÏ °Ô¡£
µ¶¸³ ½ÇÇàÇü ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇà µÉ ¶§¸¶´Ù ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çü½Ä ¶óÀ̺귯¸®¸¦ µî·Ï ÇÏ·Á¸é:
InitInstance ±â´É, COleObjectFactory::UpdateRegistryAll¿¡ ´ë ÇÑ È£ÃâÀ» ã½À´Ï´Ù. ÀÌ È£Ãâ¿¡ µû¶ó AfxOleRegisterTypeLib, ÇØ´ç Çü½Ä ¶óÀ̺귯¸®ÀÇ À̸§°ú ÇÔ²² Çü½Ä ¶óÀ̺귯¸®¿¡ LIBID ¸¦ ÁöÁ¤ Çϸé È£Ãâ Ãß°¡/ / ¼¹ö ÀÀ¿ë ÇÁ·Î±×·¥À» µ¶¸³ ½ÇÇàÇü ½ÃÀÛ, ±×°Ç ÁÁÀº »ý°¢ÀÌ
/ / ¼Õ»ó µÈ °æ¿ì ½Ã½ºÅÛ ·¹Áö½ºÆ®¸®¸¦ ¾÷µ¥ÀÌÆ® ÇÕ´Ï´Ù.
m_serverÀÔ´Ï´Ù.UpdateRegistry(OAT_DISPATCH_OBJECT);
COleObjectFactory::UpdateRegistryAll();
/ / DUAL_SUPPORT_START
/ / Çü½Ä ¶óÀ̺귯¸® µî·Ï ¶Ç´Â ÀÌÁß ÀÎÅÍÆäÀ̽º ÀÛµ¿ ÇÏÁö ¾Ê½À´Ï´Ù ÀÖ´ÂÁö È®ÀÎ ÇÕ´Ï´Ù.
AfxOleRegisterTypeLib(AfxGetInstanceHandle(), LIBID_ACDual, _T("AutoClik.TLB"));
/ / DUAL_SUPPORT_END
Çü½Ä ¶óÀ̺귯¸® º¯°æ ³»¿ë¿¡ ¸Â°Ô ÇÁ·ÎÁ§Æ® ºôµå ¼³Á¤ ¼öÁ¤
¼öÁ¤ ÇÁ·ÎÁ§Æ®ÀÇ ºôµå ¼³Á¤À» UUID Á¤Àǰ¡ Æ÷ÇÔ µÈ Çì´õ ÆÄÀÏ¿¡ ÀÇÇØ »ý¼º µÇ´Â MkTypLib Çü½Ä ¶óÀ̺귯¸®¸¦ ´Ù½Ã ÀÛ¼º ÇÏ´Â ¶§¸¶´Ù
MkTypLib »ý¼º µÈ Çì´õ ÆÄÀÏÀÇ UUID Á¤ÀÇ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ ÇÏ·Á¸é:
/ / initIIDs.c: µà¾ó ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ Iid¸¦ Á¤ÀÇ
/ /ÀÌ ¹Ì¸® ÄÄÆÄÀÏµÈ Çì´õ¿Í ÇÔ²² ³»Àå µÇÁö ÇØ¾ß ÇÕ´Ï´Ù.
# include lt;ole2.h >
# include <initguid.h>
# include "acdual.h"
Çü½Ä ¶óÀ̺귯¸®¿¡¼ ¿Ã¹Ù¸¥ °³Ã¼ Ŭ·¡½º À̸§ ÁöÁ¤
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¿À·ù Äڵ尡 ¹ß»ý ÇÑ ¿¹¿Ü Çü½Ä¿¡ µû¶ó ¹Ýȯ °áÁ¤
hr = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, nbsp;???????????????????????? (e-> m_wCode + 0x200))
ÀÌ ¿¹¿Ü¸¦ ¹ß»ý ½ÃŲ ÀÎÅÍÆäÀ̽º¿¡ ƯÁ¤ HRESULT ¸¦ ¸¸µì´Ï´Ù. ¿À·ù ÄÚµå HRESULTs Ç¥ÁØ OLE ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ ½Ã½ºÅÛ Á¤ÀÇ ¾î¶² Ãæµ¹À» ÇÇÇϱâ À§ÇØ 0x200 ¿ÀÇÁ¼ÂÀÔ´Ï´Ù.
E_OUTOFMEMORY ¹Ýȯ µË´Ï´Ù¡£E_UNEXPECTED ¹Ýȯ µË´Ï´Ù¡£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)