다음을 통해 공유


TN039: MFC/OLE 자동화 구현

[!참고]

온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.

OLE IDispatch 인터페이스 개요

IDispatch 인터페이스 기준이 응용 프로그램 노출 메서드와 속성 같은 다른 언어, 또는 Visual BASIC과 같은 다른 응용 프로그램을 만들 수 있습니다 응용 프로그램의 기능을 사용 하는 방법입니다.이 인터페이스는 가장 중요 한 부분입니다 있는 IDispatch::Invoke 함수.MFC를 사용 하 여 "디스패치 맵입니다." 구현에 IDispatch::Invoke.디스패치 맵 레이아웃 또는 "모양"의 MFC 구현 정보를 제공을 CCmdTarget-개체의 속성을 조작 하거나 멤버 함수를 만족 하는 개체 내에서 호출할 수 있습니다 직접 하도록 파생 클래스에서 IDispatch::Invoke 요청 합니다.

대부분의 경우 대부분의 프로그래머가 응용 프로그램에서 OLE 자동화의 세부 정보 숨기기 클래스 마법사와 MFC 협력 합니다.프로그래머가 응용 프로그램에서 노출 하는 실제 기능에 설명 하 고 기본 배관에 대 한 염려가 없습니다.

그러나 배후 MFC 뭘입니다 이해 하는 경우입니다.프레임 워크를 할당 하는 방법이 참고가를 해결 하는 DISPID멤버 함수 및 속성에 대 한 s.MFC를 사용 하 여 할당에 대 한 알고리즘의 기술 DISPIDs 응용 프로그램의 개체를 만들 때 "형식 라이브러리" 같은 Id를 알아야 할 때 필요한 것만.

MFC dispid가 할당

자동화 (Visual Basic 사용자, 예를 들어), 최종 사용자가 볼 수 있지만 실제 이름을 자동화 속성 및 메서드를 해당 코드 (예: 사항은.obj를에서 사용 합니다.ShowWindow) 구현의 IDispatch::Invoke 실제 이름을 수신 하지 않습니다.최적화 이유로 수신 된 DISPID, "메서드 또는 속성에 액세스할 수 있는 설명 32 비트 마법 쿠키"입니다.이러한 DISPID 값에서 반환 되는 IDispatch 구현을 호출 하는 다른 메서드를 통해 IDispatch::GetIDsOfNames.자동화 클라이언트 응용 프로그램을 호출 합니다 GetIDsOfNames 각 멤버 또는 속성에 대 한 액세스 및 그 이후 호출을 위해 개체를 캐시 하 여 하려는 후 IDispatch::Invoke.이 방법은 비용이 많이 드는 문자열 조회만 번 개체 사용 당 대신 한 번 당 이루어집니다 IDispatch::Invoke 를 호출 합니다.

MFC의 결정을 DISPIDs 각 메서드 및 속성에 대 한 두 가지 사항에 따라:

  • 디스패치 맵 (1 기준)의 위쪽 까지의 거리

  • 디스패치 맵 가장 많이 파생 된 클래스 (0 상대)에서 거리

DISPID 두 부분으로 나뉩니다.LOWORDDISPID 거리 디스패치 맵 맨 위에서 첫 번째 구성 요소가 들어 있습니다.HIWORD 거리에서 가장 많이 파생 된 클래스를 포함 합니다.예를 들면 다음과 같습니다.

class CDispPoint : public CCmdTarget
{
public:
    short m_x, m_y;
    ...
    DECLARE_DISPATCH_MAP()
    ...
};

class CDisp3DPoint : public CDispPoint
{
public:
    short m_z;
    ...
    DECLARE_DISPATCH_MAP()
    ...
};

BEGIN_DISPATCH_MAP(CDispPoint, CCmdTarget)
    DISP_PROPERTY(CDispPoint, "x", m_x, VT_I2)
    DISP_PROPERTY(CDispPoint, "y", m_y, VT_I2)
END_DISPATCH_MAP()

BEGIN_DISPATCH_MAP(CDisp3DPoint, CDispPoint)
    DISP_PROPERTY(CDisp3DPoint, "z", m_z, VT_I2)
END_DISPATCH_MAP()

볼 수 있듯이 두 클래스를 모두 OLE 자동화 인터페이스 노출 됩니다.이러한 클래스 중 하나에서 다른 파생 된 및 따라서 OLE 자동화 부품을 포함 하 여 기본 클래스의 기능을 활용 하 여 ("x" 및 "y"이 경우에서 등록 정보).

MFC 생성 됩니다 DISPIDs Cdisppoint는 다음과 같이 클래스:

property X    (DISPID)0x00000001
property Y    (DISPID)0x00000002

속성은 기본 클래스에 없기 때문에 HIWORDDISPID 항상 0 (0 Cdisppoint의 가장 많이 파생 된 클래스에서 거리 임)입니다.

MFC 생성 됩니다 DISPIDs Cdisp3dpoint는 다음과 같이 클래스:

property Z    (DISPID)0x00000001
property X    (DISPID)0x00010001
property Y    (DISPID)0x00010002

Z 속성을 지정 하지는 DISPID 0 HIWORD Cdisp3dpoint의 속성을 노출 하는 클래스에 정의 되어 있기 때문입니다.X 및 Y 속성은 기본 클래스에 정의 되지 않았기 때문에 HIWORDDISPID 이러한 속성을 정의 하는 클래스의 가장 많이 파생 된 클래스를 파생 한 거리 1 이므로.

[!참고]

LOWORD 맵에 명시적으로 있어도 항상 구조에서 위치를 기준으로 결정 됩니다 DISPID (에 대 한 내용은 다음 섹션을 참조 하십시오의 _ID 버전의 DISP_PROPERTYDISP_FUNCTION 매크로).

MFC 디스패치 맵 기능 고급

이 버전의 Visual C++ 클래스 마법사에서 지원 하지 않는 추가 기능의 숫자로가입니다.클래스 마법사 지원 DISP_FUNCTION, DISP_PROPERTY, 및 DISP_PROPERTY_EX 정의할 메서드, 멤버 변수 속성 및 get/set 멤버 함수 속성을 각각.이러한 기능을 일반적으로 대부분의 자동화 서버를 만드는 데 필요한 모든입니다.

지원 되는 클래스 마법사 매크로 적합 하지 않은 경우 다음 추가 매크로 사용할 수 있습니다: DISP_PROPERTY_NOTIFY, 및 DISP_PROPERTY_PARAM.

DISP_PROPERTY_NOTIFY-매크로 설명

DISP_PROPERTY_NOTIFY( 
   theClass, 
   pszName, 
   memberName, 
   pfnAfterSet, 
   vtPropType 
)

설명

w7a36sdf.collapse_all(ko-kr,VS.110).gif매개 변수

  • theClass
    클래스의 이름입니다.

  • pszName
    외부 속성 이름입니다.

  • memberName
    속성에 저장할 멤버 변수의 이름입니다.

  • pfnAfterSet
    속성이 변경 될 때 호출 하는 멤버 함수의 이름입니다.

  • vtPropType
    속성의 형식을 지정 하는 값입니다.

설명

이 매크로 비슷하게 됩니다 DISP_PROPERTY, 추가 인수를 받아들이는 것을 제외 하 고.추가 인수를 pfnAfterSet, 는 nothing을 반환 하 고 'void OnPropertyNotify()' 매개 변수를 사용 하는 멤버 함수 여야 합니다.이 메서드가 호출 됩니다 후 멤버 변수 수정 되었습니다.

DISP_PROPERTY_PARAM-매크로 설명

DISP_PROPERTY_PARAM( 
   theClass,
   pszName,
   pfnGet,
   pfnSet,
   vtPropType,
   vtsParams 
)

설명

w7a36sdf.collapse_all(ko-kr,VS.110).gif매개 변수

  • theClass
    클래스의 이름입니다.

  • pszName
    외부 속성 이름입니다.

  • memberGet
    속성을 가져오는 데 사용 되는 멤버 함수의 이름입니다.

  • memberSet
    속성을 설정 하는 데 사용 되는 멤버 함수의 이름입니다.

  • vtPropType
    속성의 형식을 지정 하는 값입니다.

  • vtsParams
    각 매개 변수에 대해 VTS_ 구분 하는 문자열 공간입니다.

설명

처럼의 DISP_PROPERTY_EX 매크로이 매크로 별도 Get 및 Set 멤버 함수에 액세스 하는 속성을 정의 합니다.그러나이 매크로 매개 변수 목록은 속성을 지정할 수 있습니다.다른 방법으로는 매개 변수화 하거나 인덱싱된 속성을 구현 하는 데 유용 합니다.매개 변수 항상 먼저 속성의 새 값 뒤에 놓입니다.예를 들면 다음과 같습니다.

DISP_PROPERTY_PARAM(CMyObject, "item", GetItem, SetItem, VT_DISPATCH,    VTS_I2 VTS_I2)

get 및 set 멤버 함수에 해당 됩니다.

LPDISPATCH CMyObject::GetItem(short row, short col)
void CMyObject::SetItem(short row, short col, LPDISPATCH newValue)

DISP_XXXX_ID-매크로 설명

DISP_FUNCTION_ID( 
   theClass,
   pszName,
   dispid,
   pfnMember,
   vtRetVal,
   vtsParams 
)
DISP_PROPERTY_ID( 
   theClass,
   pszName,
   dispid,
   memberName,
   vtPropType 
)
DISP_PROPERTY_NOTIFY_ID( 
   theClass,
   pszName,
   dispid,
   memberName,
   pfnAfterSet,
   vtPropType 
)
DISP_PROPERTY_EX_ID( 
   theClass,
   pszName,
   dispid,
   pfnGet,
   pfnSet,
   vtPropType 
)
DISP_PROPERTY_PARAM_ID( 
   theClass,
   pszName,
   dispid,
   pfnGet,
   pfnSet,
   vtPropType,
   vtsParams 
)

설명

w7a36sdf.collapse_all(ko-kr,VS.110).gif매개 변수

  • theClass
    클래스의 이름입니다.

  • pszName
    외부 속성 이름입니다.

  • dispid
    메서드나 속성에 대 한 DISPID 고정된 합니다.

  • pfnGet
    속성을 가져오는 데 사용 되는 멤버 함수의 이름입니다.

  • pfnSet
    속성을 설정 하는 데 사용 되는 멤버 함수의 이름입니다.

  • memberName
    속성을 매핑하려면 멤버 변수의 이름

  • vtPropType
    속성의 형식을 지정 하는 값입니다.

  • vtsParams
    각 매개 변수에 대해 VTS_ 구분 하는 문자열 공간입니다.

설명

지정할 수 있도록이 매크로 DISPID MFC에 자동으로 대신 하나를 할당 합니다.매크로 이름에는 해당 ID (예: 추가 제외 하 고 이러한 고급 매크로 같은 이름을 가진합니다DISP_PROPERTY_ID)의 ID 바로 뒤를 지정 하는 매개 변수에 의해 결정 됩니다 있는 pszName 매개 변수.AFXDISP를 참조 하십시오.이러한 매크로 대 한 자세한 내용은 H입니다._ID 엔트리를 디스패치 맵 끝에 배치 해야 합니다.자동에 영향을 미칩니다 DISPID 세대에서 같은 방식으로 비-_ID 버전 매크로 (의 DISPIDs 위치에 따라 결정 됩니다).예를 들면 다음과 같습니다.

BEGIN_DISPATCH_MAP(CDisp3DPoint, CCmdTarget)
    DISP_PROPERTY(CDisp3DPoint, "y", m_y, VT_I2)
    DISP_PROPERTY(CDisp3DPoint, "z", m_z, VT_I2)
    DISP_PROPERTY_ID(CDisp3DPoint, "x", 0x00020003, m_x, VT_I2)
END_DISPATCH_MAP()

MFC Dispid CDisp3DPoint 클래스에는 다음과 같이 생성 합니다.

property X    (DISPID)0x00020003
property Y    (DISPID)0x00000002
property Z     (DISPID)0x00000001

고정으로 지정 DISPID 기존 디스패치 인터페이스에 이전 버전과 호환성을 유지 하기 위해 또는 특정 시스템 정의 메서드나 속성을 구현할 수 있습니다 (일반적으로 네거티브가 표시 DISPID, 같은 DISPID_NEWENUM 컬렉션).

w7a36sdf.collapse_all(ko-kr,VS.110).gif활성화에 대 한 IDispatch 인터페이스를 검색합니다.

많은 서버 OLE 서버 기능과 더불어 해당 문서 개체 내에서 자동화를 지원 합니다.이 자동화 인터페이스에 액세스 하기 위해 직접 액세스 하는 데 필요한 것은 COleClientItem::m_lpObject 멤버 변수입니다.아래 코드를 검색은 IDispatch 파생 개체에 대해 인터페이스 COleClientItem.이 기능이 필요한 경우 응용 프로그램에서 다음 코드를 포함할 수 있습니다.

LPDISPATCH CMyClientItem::GetIDispatch()
{
    ASSERT_VALID(this);
    ASSERT(m_lpObject != NULL);

    LPUNKNOWN lpUnk = m_lpObject;

    Run();    // must be running

    LPOLELINK lpOleLink = NULL;
    if (m_lpObject->QueryInterface(IID_IOleLink, 
        (LPVOID FAR*)&lpOleLink) == NOERROR)
    {
        ASSERT(lpOleLink != NULL);
        lpUnk = NULL;
        if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
        {
            TRACE0("Warning: Link is not connected!\n");
            lpOleLink->Release();
            return NULL;
        }
        ASSERT(lpUnk != NULL);
    }

    LPDISPATCH lpDispatch = NULL;
    if (lpUnk->QueryInterface(IID_IDispatch, &lpDispatch) 
        != NOERROR)
    {
        TRACE0("Warning: does not support IDispatch!\n");
        return NULL;
    }

    ASSERT(lpDispatch != NULL);
    return lpDispatch;
}

디스패치 인터페이스에서 반환이 함수 다음 직접 사용 또는 연결할 수 있는 COleDispatchDriver 에 대 한 형식 안전 액세스.직접 사용 하는 경우에 호출 해야 해당 릴리스 멤버 통해 때 마우스 포인터와 (는 COleDispatchDriver 소멸자를 하지이 기본적으로).

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트