다음을 통해 공유


서비스 맵 매크로

이러한 매크로는 서비스 맵 및 항목을 정의합니다.

속성 설명
BEGIN_SERVICE_MAP ATL 서비스 맵의 시작을 표시합니다.
END_SERVICE_MAP ATL 서비스 맵의 끝을 표시합니다.
SERVICE_ENTRY 개체가 특정 서비스 ID를 지원한다는 것을 나타냅니다.
SERVICE_ENTRY_CHAIN IServiceProviderImpl::QueryService가 지정된 개체에 연결하도록 지시합니다.

요구 사항

헤더: atlcom.h

BEGIN_SERVICE_MAP

서비스 맵의 시작을 표시합니다.

BEGIN_SERVICE_MAP(theClass)

매개 변수

theClass
[in] 서비스 맵을 포함하는 클래스를 지정합니다.

설명

서비스 맵을 사용하여 COM 개체에 서비스 공급자 기능을 구현합니다. 먼저 IServiceProviderImpl에서 클래스를 파생시켜야 합니다. 두 가지 유형의 항목이 있습니다.

  • SERVICE_ENTRY 지정된 SID(서비스 ID)에 대한 지원을 나타냅니다.

  • SERVICE_ENTRY_CHAIN 지정된 다른 개체에 연결하도록 IServiceProviderImpl::QueryService에 지시합니다.

예시

BEGIN_SERVICE_MAP(CMyService)
   SERVICE_ENTRY(SID_SBindHost)  // This object supports the SBindHost service
   SERVICE_ENTRY_CHAIN(m_spClientSite) // Everything else, just ask the container
END_SERVICE_MAP()

END_SERVICE_MAP

서비스 맵의 끝을 표시합니다.

END_SERVICE_MAP()

예시

BEGIN_SERVICE_MAP 대한 예제를 참조하세요.

SERVICE_ENTRY

개체가 SID로 지정된 서비스 ID를 지원한다는 것을 나타냅니다.

SERVICE_ENTRY( SID )

매개 변수

SID
서비스 ID입니다.

예시

BEGIN_SERVICE_MAP 대한 예제를 참조하세요.

SERVICE_ENTRY_CHAIN

IServiceProviderImpl::QueryService가 펑크로 지정된 개체에 연결하도록 지시합니다.

SERVICE_ENTRY_CHAIN( punk )

매개 변수

punk
연결할 IUnknown 인터페이스에 대한 포인터입니다.

예시

BEGIN_SERVICE_MAP 대한 예제를 참조하세요.

IServiceProviderImpl::QueryService

지정된 서비스를 만들거나 액세스하고 서비스의 지정된 인터페이스에 대한 인터페이스 포인터를 반환합니다.

STDMETHOD(QueryService)(
    REFGUID guidService,
    REFIID riid,
    void** ppvObject);

매개 변수

guidService
[in] SID(서비스 식별자)에 대한 포인터입니다.

riid
[in] 호출자가 액세스 권한을 얻을 인터페이스의 식별자입니다.

ppvObj
[out] 요청된 인터페이스에 대한 간접 포인터입니다.

Return Value

반환된 HRESULT는 다음 값 중 하나입니다.

반환 값 의미
S_OK 서비스를 성공적으로 만들거나 검색했습니다.
E_INVALIDARG 하나 이상의 인수가 잘못된 경우
E_OUTOFMEMORY 메모리가 부족하여 서비스를 만들 수 없습니다.
E_UNEXPECTED 알 수 없는 오류가 발생했습니다.
E_NOINTERFACE 요청된 인터페이스가 이 서비스의 일부가 아니거나 서비스를 알 수 없습니다.

설명

QueryService 는 지정된 서비스의 요청된 인터페이스에 대한 간접 포인터를 반환합니다. 호출자는 더 이상 필요하지 않은 경우 이 포인터를 해제할 책임이 있습니다.

호출 QueryService할 때 서비스 식별자(guidService)와 인터페이스 식별자(riid)를 모두 전달합니다. guidService액세스하려는 서비스를 지정하고 riid는 서비스의 일부인 인터페이스를 식별합니다. 그 대가로 인터페이스에 대한 간접 포인터를 받게 됩니다.

인터페이스를 구현하는 개체는 다른 서비스의 일부인 인터페이스를 구현할 수도 있습니다. 다음과 같은 가능성을 고려합니다.

  • 이러한 인터페이스 중 일부는 선택 사항일 수 있습니다. 서비스 설명에 정의된 모든 인터페이스가 서비스의 모든 구현 또는 반환된 모든 개체에 반드시 있는 것은 아닙니다.

  • 호출과 QueryInterface달리 다른 서비스 식별자를 전달한다고 해서 반드시 다른 COM(Component Object Model) 개체가 반환되는 것은 아닙니다.

  • 반환된 개체에는 서비스 정의의 일부가 아닌 다른 인터페이스가 있을 수 있습니다.

SID_SMyService 및 SID_SYourService 같은 두 개의 서로 다른 서비스는 둘 다 동일한 인터페이스의 사용을 지정할 수 있습니다. 인터페이스 구현에는 두 서비스 간에 공통된 것이 없을 수 있습니다. 이 방법은 호출(SID_SMyService, IID_IDispatch)이 (SID_SYourService, IID_IDispatch)와 다른 개체 QueryService 를 반환할 수 있기 때문에 QueryService 작동합니다. 개체 ID는 다른 서비스 식별자를 지정할 때 가정되지 않습니다.

참고 항목

매크로