TN071: MFC IOleCommandTarget ±¸Çö

IOleCommandTarget ÀÎÅÍÆäÀ̽º °³Ã¼ ¹× ±×µéÀÇ ÄÁÅ×À̳ʸ¦ ¼­·Î °Ô ¸í·ÉÀ» Àü´Þ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, °³Ã¼ÀÇ µµ±¸ ¸ðÀ½ ´ÜÃß¿Í °°Àº Àμâ, Àμ⠹̸® º¸±â, ÀúÀå, »õ·Î ¸¸µé±â, È®´ë/Ãà¼Ò¸í·ÉÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ °³Ã¼°¡ Çß´Ù IOleCommandTargetÀ» Áö ¿øÇÏ´Â ÄÁÅ×À̳ʿ¡ Æ÷ÇÔ µÇ¾î ÀÖ´Â °æ¿ì °³Ã¼´Â ÇØ´ç ´ÜÃ߸¦ »ç¿ë ÇÏ °í »ç¿ëÀÚ µéÀ» Ŭ¸¯ÇÒ ¶§ ó¸® ÇÏ´Â ÄÁÅ×À̳ʿ¡ ¸í·ÉÀ» Àü´ÞÇÒ ¼ö ÀÖ½À´Ï´Ù. ÄÁÅ×ÀÌ³Ê ÀÚü¸¦ Àμâ ÇÏ·Á¸é Æ÷ÇÔ µÈ °³Ã¼¸¦ ¿øÇÏ´Â °æ¿ì ±×°ÍÀº Æ÷ÇÔ µÈ °³Ã¼ÀÇ IOleCommandTarget ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ¸í·ÉÀ» Àü¼Û ÇÏ ¿©ÀÌ ¿äûÀ» ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

IOleCommandTarget ´Â ÀÚµ¿È­¿Í °°Àº ÀÎÅÍÆäÀ̽º¸¦ »ç¿ë ÇÏ´Â ¼­¹ö¿¡¼­ ¸Þ¼­µå¸¦ È£Ãâ Çϴ Ŭ¶óÀ̾ðÆ®¿¡ ÀÇÇØ »ç¿ë µË´Ï´Ù. ±×·¯³ª ÇÁ·Î±×·¡¸ÓÀÇ IDispatch ÀϹÝÀûÀ¸·Î ºñ½Ñ Invoke ¸Þ¼­µå¸¦ »ç¿ë ÇÏÁö ¾Ê¾Æµµ µÇ¹Ç·Î ÀÚµ¿È­ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ È£Ãâ ÇÏ´Â ¿À¹ö Çìµå¸¦ ÀúÀå IOleCommandTarget À» »ç¿ë ÇÏ ¿©¡£

MFC´Â IOleCommandTarget ÀÎÅÍÆäÀ̽º ÆÄ°ß ¸í·ÉÀ» ¼­¹ö¿¡ ¾×Ƽºê ¹®¼­ ÄÁÅ×ÀÌ³Ê ¼ö ÀÖµµ·Ï ¾×Ƽºê ¹®¼­ ¼­¹ö¿¡ ÀÇÇØ »ç¿ë µË´Ï´Ù. ¾×Ƽºê ¹®¼­ ¼­¹ö Ŭ·¡½º, CDocObjectServerItem, MFC ÀÎÅÍÆäÀ̽º ¸ÊÀ» »ç¿ë ÇÏ ¿© (ÂüÁ¶ TN038: MFC/OLE IUnknown ±¸Çö) IOleCommandTarget ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÏ¡£

IOleCommandTarget ´Â ¶ÇÇÑ COleFrameHook Ŭ·¡½º¿¡¼­ ±¸Çö µË´Ï´Ù. COleFrameHook ´Â Á¦ÀÚ¸®¿¡¼­ ÆíÁý ÄÁÅ×À̳ÊÀÇ ÇÁ·¹ÀÓ Ã¢ ±â´ÉÀ» ±¸Çö ÇÏ´Â ¹®¼­È­ µÇÁö ¾ÊÀº MFC Ŭ·¡½ºÀÔ´Ï´Ù. ¶ÇÇÑ COleFrameHook MFC ÀÎÅÍÆäÀ̽º ¸ÊÀ» »ç¿ë ÇÏ ¿© IOleCommandTarget ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÕ´Ï´Ù. COleFrameHookÀÇ ±¸ÇöÀÇ IOleCommandTarget COleDocObjectItemOLE ¸í·É Àü´Þ-¾×Ƽºê ¹®¼­ ÄÁÅ×À̳ʸ¦ ÆÄ»ý ÇÕ´Ï´Ù. ÀÌ·¸°Ô Çϸé Æ÷ÇÔ µÈ ¾×Ƽºê ¹®¼­ ¼­¹ö¿¡¼­ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¸ðµç MFC ¾×Ƽºê ¹®¼­ ÄÁÅ×À̳ʡ£

MFC OLE ¸í·É Áöµµ

MFC °³¹ßÀÚ°¡ È°¿ëÇÒ ¼ö IOleCommandTarget MFC OLE ¸í·É Áöµµ »ç¿ë ÇÏ ¿©. OLE ¸í·É Áöµµ ¸Þ½ÃÁö OLE ¸í·É ¸í·É Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¿¡ ¸ÅÇÎÇÒ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡ Áöµµ ó·³. ÀÌ ÀÛ¾÷À» ÇÏ·Á¸é ¸ÅÅ©·Î ó¸® ¸í·ÉÀ», OLE ¸í·É ¹× ¸í·É IDÀÇ OLE ¸í·É ±×·ìÀ» ÁöÁ¤ ÇÏ·Á¸é ¸í·É Áöµµ¿¡¼­ Àå¼Ò¸¦ WM_COMMAND ¸Þ½ÃÁö¸¦ OLE ¸í·ÉÀ» ¹ÞÀ¸¸é º¸³»Áú °Í ÀÌ´Ù. ¶ÇÇÑ MFC Ç¥ÁØ OLE ¸í·É¿¡ ´ë ÇÑ ´Ù¾ç ÇÑ ¹Ì¸® Á¤ÀÇ µÈ ¸ÅÅ©·Î Á¦°øÇÕ´Ï´Ù. Ç¥ÁØ OLEÀÇ ¸ñ·Ï¿¡ ´ë ÇÑ ¸í·É¿¡ ´ë ÇÑ ¿ø·¡ ¼³°è µÈ Microsoft Office ÀÀ¿ë ÇÁ·Î±×·¥°ú ÇÔ²² »ç¿ë ÇÏ ¿©, docobj.h¿¡¼­ Á¤ÀÇ ÇÏ´Â OLECMDID ¿­°ÅÇüÀ» ÂüÁ¶ ÇϽʽÿÀ¡£

OLE ¸í·É Áöµµ Æ÷ÇÔ ÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ OLE ¸í·ÉÀ» ¹ÞÀ¸¸é MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ OLE ¸í·É Áöµµ¿¡¼­ ¿äûÇÑ ¸í·É¿¡ ´ë ÇÑ ¸í·É ID¿Í ¸í·É ±×·ìÀ» ã¾Æ ÇÏ·Á°í ½Ãµµ ÇÕ´Ï´Ù. ÀÏÄ¡ ÇÏ´Â °æ¿ì WM_COMMAND ¸Þ½ÃÁö ¿äûµÈ ¸í·É ID¿Í ¸í·É Áöµµ Æ÷ÇÔ ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡ Àü´Þ µË´Ï´Ù. ( ON_OLECMD ¾Æ·¡ ¼³¸í ÂüÁ¶). ÀÌ·± ¹æ½ÄÀ¸·Î OLE ¸í·ÉÀº ÀÀ¿ë ÇÁ·Î±×·¥¿¡ µð½ºÆÐÄ¡µÇ´Â MFC¿¡ ÀÇÇØ WM_COMMAND ¸Þ½ÃÁö¿¡ ¼³Á¤ µÇ¾î ÀÖ½À´Ï´Ù. MFC Ç¥ÁØÀ» »ç¿ë ÇÏ ¿© ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ¸ÊÀ» ÅëÇØ WM_COMMAND ¸Þ½ÃÁö¸¦ ¶ó¿ìÆÃÇÑ ´ÙÀ½ ¸í·É ¶ó¿ìÆà ¾ÆÅ°ÅØó¡£

¸Þ½ÃÁö Áöµµ´Â ´Þ¸® MFC OLE ¸í·É Áöµµ Classwizard¿¡ ÀÇÇØ Áö¿ø µÇÁö ¾Ê½À´Ï´Ù. MFC °³¹ßÀÚ°¡ OLE ¸í·É Áöµµ Áö¿ø ¹× OLE ¸í·É Áöµµ Ç׸ñÀ» Á÷Á¢ Ãß°¡ ÇØ¾ß ÇÕ´Ï´Ù. OLE ¸í·É ÇöÀç ¹®¼­ ´ç½Ã ÇÑ WM_COMMAND ¸Þ½ÃÁö ¶ó¿ìÆà üÀο¡ ÀÖ´Â ¸ðµç Ŭ·¡½º¿¡¼­ MFC ¾×Ƽºê ¹®¼­ ¼­¹ö¿¡ Áöµµ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù Àå¼Ò¿¡ ¾×Ƽºê ÄÁÅ×À̳ʿ¡¼­ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Å¬·¡½º´Â CWinApp, CView, CDocument¹× COleIPFrameWnd¿¡¼­ ÆÄ»ý µÈ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Å¬·¡½º¸¦ Æ÷ÇÔ ÇÕ´Ï´Ù. ¾×Ƽºê ¹®¼­ ÄÁÅ×À̳ʿ¡¼­ OLE ¸í·É Áöµµ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù COleDocObjectItem-Ŭ·¡½º¸¦ ÆÄ»ý ÇÕ´Ï´Ù. ¶ÇÇÑ ¾×Ƽºê ¹®¼­ ÄÁÅ×À̳ʿ¡¼­ WM_COMMAND ¸Þ½ÃÁö¸¸ ¹ß¼Û µË´Ï´Ù COleDocObjectItem¸Þ½ÃÁö ¸Ê¿¡-ÆÄ»ý Ŭ·¡½º¡£

OLE ¸Ê ¸ÅÅ©·Î ¸í·É

´ÙÀ½ ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© Ŭ·¡½º¿¡ ¸í·É Áöµµ ±â´É Ãß°¡:

DECLARE_OLECMD_MAP)

ÀÌ ¸ÅÅ©·Î ¸í·É Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ Å¬·¡½º ¼±¾ð (ÀϹÝÀûÀ¸·Î Çì´õ ÆÄÀÏ)¿¡ °£´Ù¡£

BEGIN_OLECMD_MAP (Ŭ·¡½º, baseClass)

Ŭ·¡½º

¸í·É Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ À̸§¡£

baseClass

¸í·É Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ ±âº» Ŭ·¡½ºÀÇ À̸§¡£

ÀÌ ¸ÅÅ©·Î ¸í·É ÁöµµÀÇ ½ÃÀÛÀ» Ç¥½Ã ÇÕ´Ï´Ù. ÀÌ ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© ¸í·É Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ ±¸Çö ÆÄÀÏ¿¡¡£

 END_OLECMD_MAP()

ÀÌ ¸ÅÅ©·Î ¸í·É ÁöµµÀÇ ³¡À» Ç¥½Ã ÇÕ´Ï´Ù. ÀÌ ¸ÅÅ©·Î »ç¿ë ÇÏ ¿© ¸í·É Áöµµ Æ÷ÇÔ Çϴ Ŭ·¡½ºÀÇ ±¸Çö ÆÄÀÏ¿¡ ÀÖ½À´Ï´Ù. ÀÌ ¸ÅÅ©·Î Ç×»ó µû¶ó¾ß ÇÕ´Ï´Ù BEGIN_OLECMD_MAP ¸ÅÅ©·Î¡£

ON_OLECMD (pguid, olecmdid, id)

pguid

OLE ¸í·É ¸í·É ±×·ìÀÇ GUID Æ÷ÀÎÅÍÀÔ´Ï´Ù. ÀÌ ¸Å°³ º¯¼ö´Â Ç¥ÁØ OLE ¸í·É ±×·ì¿¡ ´ë ÇÑ NULL¡£

olecmdid

OLE ¸í·É È£ÃâÇÒ ¸í·É ID¡£

id

ÀÌ OLE ¸í·ÉÀ» È£Ãâ ÇÏ¸é ¸í·É Áöµµ Æ÷ÇÔ ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡ Àü¼Û µÇµµ·Ï WM_COMMAND ¸Þ½ÃÁöÀÇ ID¡£

»ç¿ë µÈ ON_OLECMD OLE¿¡ ´ë ÇÑ Ç׸ñÀ» Ãß°¡ ÇÏ·Á¸é ¸í·É Áöµµ¿¡¼­ ¸ÅÅ©·Î ó¸® ÇÏ·Á¸é ¸í·É. OLE ¸í·ÉÀ» ¹ÞÀ¸¸é ±×µéÀº ÁöÁ¤µÈ µÈ WM_COMMAND ¸Þ½ÃÁö º¯È¯ µÇ¸ç Ç¥ÁØ MFC ¸í·É ¶ó¿ìÆà ¾ÆÅ°ÅØó¸¦ »ç¿ë ÇÏ ¿© ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ¸ÊÀ» ÅëÇØ¡£

¿¹Á¦

ó¸® Çϱâ À§ÇØ MFC ¾×Ƽºê ¹®¼­ ¼­¹ö OLE ¸í·É ó¸® ±â´ÉÀ» Ãß°¡ ÇÏ´Â ¹æ¹ýÀ» º¸¿© ÁÖ´Â ¿¹Á¦´Â OLECMDID_PRINT OLE ¸í·É. ÀÌ ¿¹Á¦¿¡¼­´Â °¡Á¤ Appwizard¸¦ »ç¿ë ÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥Àº È°¼º ¹®¼­ ¼­¹ö »ý¼º¡£

  1. CView¿¡¼­-ÆÄ»ý Ŭ·¡½ºÀÇ Çì´õ ÆÄÀÏÀ» Ãß°¡ ÇÕ´Ï´Ù DECLARE_OLECMD_MAP Ŭ·¡½º ¼±¾ð¿¡ ¸ÅÅ©·Î¡£

    ¸Þ¸ðnbsp;CView¸¦ »ç¿ë ÇÏ ¿©- WM_COMMAND ¸Þ½ÃÁö ¶ó¿ìÆà üÀο¡ ¾×Ƽºê ¹®¼­ ¼­¹ö¿¡ Ŭ·¡½º À̹ǷΠÆÄ»ý Ŭ·¡½º(&N)¡£

    cMyServerView Ŭ·¡½º: °ø¿ë CView
    {
    º¸È£ µÈ: / /¸¸ serialization¿¡¼­ ¸¸µé±â
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. CView¿¡ ´ë ÇÑ ±¸Çö ÆÄÀÏ¿¡-ÆÄ»ý Ŭ·¡½º¸¦ Ãß°¡ ÇÕ´Ï´Ù BEGIN_OLECMD_MAP ¿Í END_OLECMD_MAP ¸ÅÅ©·Î:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Ç¥ÁØ Àμ⠸í·É¿¡ ´ë ÇÑ OLE ¸í·É ID ¹× ID_FILE_PRINT WM_COMMAND id ÁöÁ¤ ¸í·É Áöµµ¸¦ ON_OLECMD ¸ÅÅ©·Î Ãß°¡ Ç¥ÁØ OLE Àμ⠸í·ÉÀ» ó¸® ÇÏ ID_FILE_PRINT ´Â Ç¥ÁØ MFC Appwizard¿¡¼­ »ý¼º µÈ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ »ç¿ë ÇÏ´Â Àμ⠸í·É ID:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Âü°í´Â afxdocob.h¿¡ Á¤ÀÇ µÈ Ç¥ÁØ OLE ¸í·É ¸ÅÅ©·Î Áß Çϳª OLECMDID_PRINT ´Â Ç¥ÁØ OLE ¸í·É ID°¡ Àֱ⠶§¹®¿¡ ON_OLECMD ¸ÅÅ©·Î ´ë½Å »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù ON_OLECMD_PRINT ¸ÅÅ©·Î À§ÀÇ ON_OLECMD ¸ÅÅ©·Î·Î µ¿ÀÏÇÑ ÀÛ¾÷À» ¼öÇà ÇÕ´Ï´Ù.

ÄÁÅ×ÀÌ³Ê ÀÀ¿ë ÇÁ·Î±×·¥À» º¸³¾ ¶§ÀÌ ¼­¹ö´Â OLECMDID_PRINT ¸í·ÉÀ» ¼­¹öÀÇ IOleCommandTarget ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÀÀ¿ë ÇÁ·Î±×·¥À» Àμâ ÇÏ·Á¸é ¼­¹ö ÀÏÀ¸Å°´Â ¼­¹ö¿¡¼­ MFC Àμ⠸í·É 󸮱⸦ È£Ã⠵˴ϴÙ. À§ÀÇ ´Ü°è¿¡¼­ Ãß°¡ Àμ⠸í·ÉÀ» È£Ãâ ÇÏ´Â ¾×Ƽºê ¹®¼­ ÄÁÅ×ÀÌ³Ê Äڵ带 ÀÌ·±½ÄÀ¸·Î »ý°åÀ» °Í ÀÌ´Ù:

void CContainerCntrItem::DoOleCmd()
{
   IOleCommandTarget * pCmd = NULL;
   Hr HRESULT E_FAIL; =
   OLECMD ocm {OLECMDID_PRINT, 0} =;

hr = m_lpObject-gt;QueryInterface (IID_IOleCommandTarget, reinterpret_cast < void ** >(&pCmd));
   if(FAILED(hr))
      ¹Ýȯ;

hr = pCmd-> QueryStatus (NULL, 1 & ocm, NULL);
   if(SUCCEEDED(hr) & & (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command´Â »ç¿ë °¡´É ÇÏ °í È°¼ºÈ­ ±×·¡¼­ ±×°ÍÀ» È£Ãâ ÇÏ´Â °Í
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd-> Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, & Vin°ú vOut);
      ASSERT(SUCCEEDED(hr));
   }
   pCmd-> Release();
}

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

Index