Udostępnij za pośrednictwem


makra COM_INTERFACE_ENTRY

Te makra wprowadzają interfejsy obiektu do mapy COM, aby można było uzyskać do nich dostęp za pomocą polecenia QueryInterface. Kolejność wpisów na mapie COM to interfejsy kolejności będą sprawdzane pod kątem pasującego identyfikatora IID podczas .QueryInterface

Makro opis
COM_INTERFACE_ENTRY Wprowadza interfejsy do mapy interfejsu COM.
COM_INTERFACE_ENTRY2 Użyj tego makra, aby uściślić dwie gałęzie dziedziczenia.
COM_INTERFACE_ENTRY_IID Użyj tego makra, aby wprowadzić interfejs do mapy MODELU COM i określić jego identyfikator IID.
COM_INTERFACE_ENTRY2_IID Tak samo jak COM_INTERFACE_ENTRY2, z wyjątkiem tego, że można określić inny identyfikator IID.
COM_INTERFACE_ENTRY_AGGREGATE Gdy interfejs zidentyfikowany przez identyfikator iid jest odpytywane, COM_INTERFACE_ENTRY_AGGREGATE przekazuje do elementu punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND Tak samo jak COM_INTERFACE_ENTRY_AGGREGATE, z tą różnicą, że wykonywanie zapytań dotyczących dowolnego identyfikatora IID powoduje przekazanie zapytania do punk.
COM_INTERFACE_ENTRY_AUTOAGGREGATE Tak samo jak COM_INTERFACE_ENTRY_AGGREGATE, z wyjątkiem sytuacji, gdy punk ma wartość NULL, automatycznie tworzy agregację opisaną przez clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND Tak samo jak COM_INTERFACE_ENTRY_AUTOAGGREGATE, z wyjątkiem tego, że wykonywanie zapytań dla dowolnego identyfikatora IID powoduje przekazanie zapytania do punk, a jeśli punk ma wartość NULL, automatycznie tworząc agregację opisaną przez clsid.
COM_INTERFACE_ENTRY_BREAK Powoduje wywołanie debugbreaku podczas wykonywania zapytania o określony interfejs.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Zapisuje dane specyficzne dla interfejsu dla każdego wystąpienia.
COM_INTERFACE_ENTRY_TEAR_OFF Uwidacznia interfejsy łzawiące.
COM_INTERFACE_ENTRY_CHAIN Przetwarza mapę COM klasy bazowej, gdy przetwarzanie osiągnie ten wpis na mapie COM.
COM_INTERFACE_ENTRY_FUNC Ogólny mechanizm podłączania do logiki QueryInterface ATL.
COM_INTERFACE_ENTRY_FUNC_BLIND Tak samo jak COM_INTERFACE_ENTRY_FUNC, z tą różnicą, że wykonywanie zapytań dotyczących dowolnego identyfikatora IID powoduje wywołanie funkcji func.
COM_INTERFACE_ENTRY_NOINTERFACE Zwraca E_NOINTERFACE i kończy przetwarzanie mapy COM po wysłaniu zapytania do określonego interfejsu.

Wymagania

Nagłówek: atlcom.h

COM_INTERFACE_ENTRY

Wprowadza interfejsy do mapy interfejsu COM.

Składnia

COM_INTERFACE_ENTRY( x )

Parametry

x
[in] Nazwa interfejsu, z którego pochodzi obiekt klasy bezpośrednio.

Uwagi

Zazwyczaj jest to typ wpisu, którego najczęściej używasz.

Przykład

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

Wymagania

Nagłówek: atlcom.h

COM_INTERFACE_ENTRY2

Użyj tego makra, aby uściślić dwie gałęzie dziedziczenia.

COM_INTERFACE_ENTRY2(x, x2)

Parametry

x
[in] Nazwa interfejsu, który ma zostać udostępniony z obiektu.

x2
[in] Nazwa gałęzi dziedziczenia, z której jest uwidoczniona wartość x .

Uwagi

Jeśli na przykład obiekt klasy pochodzi z dwóch podwójnych interfejsów, można go uwidocznić IDispatch przy użyciu COM_INTERFACE_ENTRY2, ponieważ IDispatch można go uzyskać z jednego z interfejsów.

Przykład

class ATL_NO_VTABLE CEntry2Example :
   public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
   public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
   CEntry2Example()
   {
   }

BEGIN_COM_MAP(CEntry2Example)
   COM_INTERFACE_ENTRY(IEntry2Example)
   COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};

COM_INTERFACE_ENTRY_IID

Użyj tego makra, aby wprowadzić interfejs do mapy MODELU COM i określić jego identyfikator IID.

COM_INTERFACE_ENTRY_IID(iid, x)

Parametry

identyfikator iid
[in] Uwidoczniony identyfikator GUID interfejsu.

x
[in] Nazwa klasy, której vtable zostanie uwidoczniona jako interfejs zidentyfikowany przez identyfikator iid.

Przykład

BEGIN_COM_MAP(CExample)
   COM_INTERFACE_ENTRY(IExample)
   COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
   COM_INTERFACE_ENTRY(IExampleBase)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

COM_INTERFACE_ENTRY2_IID

Tak samo jak COM_INTERFACE_ENTRY2, z wyjątkiem tego, że można określić inny identyfikator IID.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Parametry

identyfikator iid
[in] Identyfikator GUID, który określasz dla interfejsu.

x
[in] Nazwa interfejsu, z którego pochodzi bezpośrednio obiekt klasy.

x2
[in] Nazwa drugiego interfejsu, z którego pochodzi bezpośrednio obiekt klasy.

COM_INTERFACE_ENTRY_AGGREGATE

Gdy interfejs zidentyfikowany przez identyfikator iid jest odpytywane, COM_INTERFACE_ENTRY_AGGREGATE przekazuje do punk.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Parametry

identyfikator iid
[in] Identyfikator GUID interfejsu, którego dotyczy zapytanie.

Punk
[in] Nazwa IUnknown wskaźnika.

Uwagi

Przyjmuje się, że parametr punk wskazuje wewnętrzną nieznaną wartość agregacji lub null, w tym przypadku wpis jest ignorowany. Zazwyczaj agregacja CoCreate jest agregacja w pliku FinalConstruct.

Przykład

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

Tak samo jak COM_INTERFACE_ENTRY_AGGREGATE, z tą różnicą, że wykonywanie zapytań dotyczących dowolnego identyfikatora IID powoduje przekazanie zapytania do punk.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Parametry

Punk
[in] Nazwa IUnknown wskaźnika.

Uwagi

Jeśli zapytanie interfejsu zakończy się niepowodzeniem, przetwarzanie mapy COM będzie kontynuowane.

Przykład

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

Tak samo jak COM_INTERFACE_ENTRY_AGGREGATE, z wyjątkiem sytuacji, gdy punk ma wartość NULL, automatycznie tworzy agregację opisaną przez clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Parametry

identyfikator iid
[in] Identyfikator GUID interfejsu, którego dotyczy zapytanie.

Punk
[in] Nazwa IUnknown wskaźnika. Musi być członkiem klasy zawierającej mapę COM.

clsid
[in] Identyfikator agregacji, który zostanie utworzony, jeśli punk ma wartość NULL.

Uwagi

Przykład

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

Tak samo jak COM_INTERFACE_ENTRY_AUTOAGGREGATE, z wyjątkiem tego, że wykonywanie zapytań dla dowolnego identyfikatora IID powoduje przekazanie zapytania do punk, a jeśli punk ma wartość NULL, automatycznie tworząc agregację opisaną przez clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Parametry

Punk
[in] Nazwa IUnknown wskaźnika. Musi być członkiem klasy zawierającej mapę COM.

clsid
[in] Identyfikator agregacji, który zostanie utworzony, jeśli punk ma wartość NULL.

Uwagi

Jeśli zapytanie interfejsu zakończy się niepowodzeniem, przetwarzanie mapy COM będzie kontynuowane.

Przykład

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

Powoduje wywołanie debugbreaku podczas wykonywania zapytania o określony interfejs.

COM_INTERFACE_ENTRY_BREAK(x)

Parametry

x
[in] Tekst używany do konstruowania identyfikatora interfejsu.

Uwagi

Identyfikator IID interfejsu zostanie skonstruowany przez dołączenie x do IID_elementu . Jeśli na przykład x to IPersistStorage, identyfikator IID będzie mieć wartość IID_IPersistStorage.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Zapisuje dane specyficzne dla interfejsu dla każdego wystąpienia.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Parametry

identyfikator iid
[in] Identyfikator GUID interfejsu odrywania.

x
[in] Nazwa klasy implementowania interfejsu.

Punk
[in] Nazwa IUnknown wskaźnika. Musi być członkiem klasy zawierającej mapę COM. Należy zainicjować wartość NULL w konstruktorze obiektu klasy.

Uwagi

Jeśli interfejs nie jest używany, spowoduje to obniżenie ogólnego rozmiaru wystąpienia obiektu.

Przykład

BEGIN_COM_MAP(COuter)
   COM_INTERFACE_ENTRY(IOuter)
   COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()

COM_INTERFACE_ENTRY_TEAR_OFF

Uwidacznia interfejsy łzawiące.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Parametry

identyfikator iid
[in] Identyfikator GUID interfejsu odrywania.

x
[in] Nazwa klasy implementowania interfejsu.

Uwagi

Interfejs odrywania jest implementowany jako oddzielny obiekt, który jest tworzone za każdym razem, gdy interfejs reprezentuje, jest odpytywane. Zazwyczaj interfejs tworzy się jako odręcz, jeśli interfejs jest rzadko używany, ponieważ zapisuje on wskaźnik w formie tabeli wirtualnej w każdym wystąpieniu głównego obiektu. Odręcz jest usuwany, gdy jego liczba odwołań staje się równa zero. Klasa implementjąca odłamek powinna pochodzić z CComTearOffObjectBase i mieć własną mapę COM.

Przykład

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

COM_INTERFACE_ENTRY_CHAIN

Przetwarza mapę COM klasy bazowej, gdy przetwarzanie osiągnie ten wpis na mapie COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Parametry

nazwa klasy
[in] Klasa bazowa bieżącego obiektu.

Uwagi

Na przykład w poniższym kodzie:

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

Należy pamiętać, że pierwszy wpis na mapie COM musi być interfejsem obiektu zawierającego mapę COM. W związku z tym nie można uruchomić wpisów mapy COM z COM_INTERFACE_ENTRY_CHAIN, co powoduje przeszukiwanie mapy COM innego obiektu w punkcie, w którym COM_INTERFACE_ENTRY_CHAIN(COtherObject) pojawia się na mapie COM obiektu. Jeśli chcesz najpierw przeszukać mapę COM innego obiektu, dodaj wpis IUnknown interfejsu do mapy MODELU COM, a następnie utwórz łańcuch mapy COM innego obiektu. Na przykład:

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

Ogólny mechanizm podłączania do logiki QueryInterface ATL.

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Parametry

identyfikator iid
[in] Uwidoczniony identyfikator GUID interfejsu.

Dw
[in] Parametr przekazany do func.

func
[in] Wskaźnik funkcji, który zwróci identyfikator iid.

Uwagi

Jeśli identyfikator iid pasuje do identyfikatora interfejsu, dla którego wykonano zapytanie, wywoływana jest funkcja określona przez func . Deklaracja funkcji powinna być następująca:

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

Po wywołaniu pv funkcji wskazuje obiekt klasy. Parametr riid odwołuje się do interfejsu, dla którego jest wykonywane zapytanie, ppv jest wskaźnikiem do lokalizacji, w której funkcja powinna przechowywać wskaźnik do interfejsu, a dw jest parametrem określonym w wpisie. Funkcja powinna ustawić wartość * ppv na wartość NULL i zwrócić E_NOINTERFACE lub S_FALSE, jeśli zdecyduje się nie zwracać interfejsu. Po E_NOINTERFACE przetwarzanie map COM kończy się. W przypadku S_FALSE przetwarzanie mapy MODELU COM jest kontynuowane, mimo że żaden wskaźnik interfejsu nie został zwrócony. Jeśli funkcja zwraca wskaźnik interfejsu, powinien zwrócić S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

Tak samo jak COM_INTERFACE_ENTRY_FUNC, z tą różnicą, że wykonywanie zapytań dotyczących dowolnego identyfikatora IID powoduje wywołanie funkcji func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Parametry

Dw
[in] Parametr przekazany do func.

func
[in] Funkcja, która jest wywoływana po przetworzeniu tego wpisu na mapie COM.

Uwagi

Wszelkie błędy spowodują kontynuowanie przetwarzania na mapie MODELU COM. Jeśli funkcja zwraca wskaźnik interfejsu, powinien zwrócić S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Zwraca E_NOINTERFACE i kończy przetwarzanie mapy COM po wysłaniu zapytania do określonego interfejsu.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Parametry

x
[in] Tekst używany do konstruowania identyfikatora interfejsu.

Uwagi

Tego makra można użyć, aby zapobiec używaniu interfejsu w konkretnym przypadku. Na przykład możesz wstawić to makro do mapy COM bezpośrednio przed COM_INTERFACE_ENTRY_AGGREGATE_BLIND, aby zapobiec przekazaniu zapytania do wewnętrznego nieznanego elementu agregacji.

Identyfikator IID interfejsu zostanie skonstruowany przez dołączenie x do IID_elementu . Jeśli na przykład x to IPersistStorage, identyfikator IID będzie mieć wartość IID_IPersistStorage.