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
.