TN071: MFC IOleCommandTarget 구현
참고 항목
다음 기술 노트는 온라인 설명서에 먼저 포함되어 있었으므로 업데이트되지 않았습니다. 따라서 일부 절차 및 항목은 만료되거나 올바르지 않을 수 있습니다. 최신 정보를 보려면 온라인 설명서 색인에서 관심 있는 항목을 검색하는 것이 좋습니다.
인터페이스 IOleCommandTarget
를 사용하면 개체와 해당 컨테이너가 서로 명령을 디스패치할 수 있습니다. 예를 들어 개체의 도구 모음에는 , , Print Preview
Save
및 Zoom
와 같은 Print
명령에 대한 단추가 New
포함될 수 있습니다. 이러한 개체가 지원하는 IOleCommandTarget
컨테이너에 포함된 경우 개체는 해당 단추를 사용하도록 설정하고 사용자가 해당 단추를 클릭할 때 처리를 위해 컨테이너에 명령을 전달할 수 있습니다. 컨테이너가 포함된 개체 자체를 인쇄하려는 경우 포함된 개체의 인터페이스를 통해 IOleCommandTarget
명령을 전송하여 이 요청을 수행할 수 있습니다.
IOleCommandTarget
는 클라이언트가 서버에서 메서드를 호출하는 데 사용된다는 측면에서 Automation과 유사한 인터페이스입니다. 그러나 IOleCommandTarget
프로그래머는 일반적으로 비용이 많이 드는 Invoke
메서드 IDispatch
를 사용할 필요가 없으므로 Automation 인터페이스를 통해 호출하는 오버헤드를 줄일 수 있습니다.
MFC IOleCommandTarget
에서 인터페이스는 활성 문서 서버에서 활성 문서 컨테이너가 서버에 명령을 디스패치할 수 있도록 하는 데 사용됩니다. 활성 문서 서버 클래스CDocObjectServerItem
는 MFC 인터페이스 맵(TN038: MFC/OLE IUnknown 구현 참조)을 사용하여 인터페이스를 IOleCommandTarget
구현합니다.
IOleCommandTarget
는 클래스에서도 COleFrameHook
구현됩니다. COleFrameHook
는 내부 편집 컨테이너의 프레임 창 기능을 구현하는 문서화되지 않은 MFC 클래스입니다. COleFrameHook
또한 MFC 인터페이스 맵을 사용하여 인터페이스를 구현합니다 IOleCommandTarget
. COleFrameHook
'의 구현 IOleCommandTarget
은 OLE 명령을 COleDocObjectItem
파생된 활성 문서 컨테이너에 전달합니다. 이렇게 하면 모든 MFC 활성 문서 컨테이너가 포함된 활성 문서 서버에서 메시지를 받을 수 있습니다.
MFC OLE 명령 지도
MFC 개발자는 MFC OLE 명령 맵을 사용하여 활용할 IOleCommandTarget
수 있습니다. OLE 명령 맵은 OLE 명령을 명령 맵이 포함된 클래스의 멤버 함수에 매핑하는 데 사용할 수 있으므로 메시지 맵과 같습니다. 이 작업을 수행하려면 명령 맵에 매크로를 배치하여 처리할 명령의 OLE 명령 그룹, OLE 명령 및 OLE 명령이 수신될 때 전송될 WM_COMMAND 메시지의 명령 ID를 지정합니다. 또한 MFC는 표준 OLE 명령에 대해 미리 정의된 여러 매크로를 제공합니다. 원래 Microsoft Office 앱lications와 함께 사용하도록 디자인된 표준 OLE 명령 목록은 docobj.h에 정의된 OLECMDID 열거형을 참조하세요.
OLE 명령 맵이 포함된 MFC 애플리케이션에서 OLE 명령을 받으면 MFC는 애플리케이션의 OLE 명령 맵에서 요청된 명령에 대한 명령 ID 및 명령 그룹을 찾으려고 시도합니다. 일치하는 항목이 발견되면 요청된 명령의 ID를 사용하여 명령 맵이 포함된 애플리케이션에 WM_COMMAND 메시지가 디스패치됩니다. (아래 설명을 ON_OLECMD
참조하세요.) 이러한 방식으로 애플리케이션에 디스패치된 OLE 명령은 MFC에서 WM_COMMAND 메시지로 변환됩니다. 그런 다음 WM_COMMAND 메시지는 MFC 표준 명령 라우팅 아키텍처를 사용하여 애플리케이션의 메시지 맵을 통해 라우팅됩니다.
메시지 맵과 달리 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(theClass, baseClass)
theClass
명령 맵을 포함하는 클래스의 이름입니다.
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 애플리케이션을 생성한다고 가정합니다.
CView
파생 클래스의 헤더 파일에서 클래스 선언에 DECLARE_OLECMD_MAP 매크로를 추가합니다.참고 항목
CView
-derived 클래스는 WM_COMMAND 메시지 라우팅 체인에 있는 활성 문서 서버의 클래스 중 하나이기 때문에 사용합니다.class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() // . . . };
파생 클래스의
CView
구현 파일에서 BEGIN_OLECMD_MAP 추가하고 매크로를 END_OLECMD_MAP.BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
표준 OLE 인쇄 명령을 처리하려면 표준 인쇄 명령의 OLE 명령 ID를 지정하고 WM_COMMAND ID에 대한 ID_FILE_PRINT 지정하는 ON_OLECMD 매크로를 명령 맵에 추가합니다. ID_FILE_PRINT AppWizard에서 생성된 MFC 애플리케이션에서 사용하는 표준 인쇄 명령 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 매크로와 동일한 작업을 수행합니다.
컨테이너 애플리케이션이 서버의 IOleCommandTarget
인터페이스를 통해 이 서버에 OLECMDID_PRINT 명령을 보내면 서버에서 MFC 인쇄 명령 처리기가 호출되어 서버가 애플리케이션을 인쇄합니다. 위 단계에 추가된 인쇄 명령을 호출하는 활성 문서 컨테이너의 코드는 다음과 같습니다.
void CContainerCntrItem::DoOleCmd()
{
IOleCommandTarget *pCmd = NULL;
HRESULT hr = E_FAIL;
OLECMD ocm={OLECMDID_PRINT, 0};
hr = m_lpObject->QueryInterface(
IID_IOleCommandTarget,reinterpret_cast<void**>(&pCmd));
if (FAILED(hr))
return;
hr = pCmd->QueryStatus(NULL, 1, &ocm, NULL);
if (SUCCEEDED(hr) && (ocm.cmdf& OLECMDF_ENABLED))
{
//Command is available and enabled so call it
COleVariant vIn;
COleVariant vOut;
hr = pCmd->Exec(NULL, OLECMDID_PRINT,
OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
ASSERT(SUCCEEDED(hr));
}
pCmd->Release();
}