Sdílet prostřednictvím


COM_INTERFACE_ENTRY makra

Tato makra zadávají rozhraní objektu do mapy MODELU COM, aby k nim bylo možné získat přístup QueryInterface. Pořadí položek v mapě COM je pořadí rozhraní bude kontrolováno pro odpovídající IID během QueryInterface.

Makro Popis
COM_INTERFACE_ENTRY Zadá rozhraní do mapy rozhraní MODELU COM.
COM_INTERFACE_ENTRY2 Toto makro slouží k nejednoznačnosti dvou větví dědičnosti.
COM_INTERFACE_ENTRY_IID Toto makro použijte k zadání rozhraní do mapy MODELU COM a určení jeho IID.
COM_INTERFACE_ENTRY2_IID Stejné jako COM_INTERFACE_ENTRY2, s výjimkou toho, že můžete zadat jiný IID.
COM_INTERFACE_ENTRY_AGGREGATE Pokud je rozhraní identifikované pomocí iid dotazováno, COM_INTERFACE_ENTRY_AGGREGATE přepošlovat na punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND Stejné jako COM_INTERFACE_ENTRY_AGGREGATE, s tím rozdílem, že dotazování na jakékoli IID vede k předání dotazu punku.
COM_INTERFACE_ENTRY_AUTOAGGREGATE Totéž jako COM_INTERFACE_ENTRY_AGGREGATE, s výjimkou případu, kdy punk je NULL, automaticky vytvoří agregaci popsanou clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND Stejné jako COM_INTERFACE_ENTRY_AUTOAGGREGATE, s tím rozdílem, že dotazování na jakékoli IID vede k předání dotazu punku, a pokud má punk hodnotu NULL, automaticky vytvoří agregaci popsanou clsid.
COM_INTERFACE_ENTRY_BREAK Způsobí, že program bude volat DebugBreak při dotazování zadaného rozhraní.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Uloží data specifická pro rozhraní pro každou instanci.
COM_INTERFACE_ENTRY_TEAR_OFF Zpřístupňuje vaše rozhraní pro odtržení.
COM_INTERFACE_ENTRY_CHAIN Zpracovává mapování modelu COM základní třídy při zpracování dosáhne této položky v mapě MODELU COM.
COM_INTERFACE_ENTRY_FUNC Obecný mechanismus pro připojení k logice QueryInterface KNIHOVNY ATL.
COM_INTERFACE_ENTRY_FUNC_BLIND Stejné jako COM_INTERFACE_ENTRY_FUNC, s tím rozdílem, že dotazování na jakékoli IID vede k volání func.
COM_INTERFACE_ENTRY_NOINTERFACE Vrátí E_NOINTERFACE a ukončí zpracování mapování modelu COM při dotazování zadaného rozhraní.

Požadavky

Hlavička: atlcom.h

COM_INTERFACE_ENTRY

Zadá rozhraní do mapy rozhraní MODELU COM.

Syntaxe

COM_INTERFACE_ENTRY( x )

Parametry

X
[v] Název rozhraní objektu třídy je odvozen přímo.

Poznámky

Obvykle se jedná o typ položky, který nejčastěji používáte.

Příklad

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

Požadavky

Hlavička: atlcom.h

COM_INTERFACE_ENTRY2

Toto makro slouží k nejednoznačnosti dvou větví dědičnosti.

COM_INTERFACE_ENTRY2(x, x2)

Parametry

X
[v] Název rozhraní, které chcete zveřejnit z objektu.

x2
[v] Název větve dědičnosti, ze které je x vystaven.

Poznámky

Pokud například odvozujete objekt třídy ze dvou duálních rozhraní, zveřejníte IDispatch pomocí COM_INTERFACE_ENTRY2, protože IDispatch lze získat z některého z těchto rozhraní.

Příklad

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

Toto makro použijte k zadání rozhraní do mapy MODELU COM a určení jeho IID.

COM_INTERFACE_ENTRY_IID(iid, x)

Parametry

Iid
[v] Identifikátor GUID rozhraní vystaveného.

X
[v] Název třídy, jejíž virtuální tabulka bude vystavena jako rozhraní identifikované iid.

Příklad

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

Stejné jako COM_INTERFACE_ENTRY2, s výjimkou toho, že můžete zadat jiný IID.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Parametry

Iid
[v] Identifikátor GUID, který zadáváte pro rozhraní.

X
[v] Název rozhraní, které objekt třídy odvozuje přímo.

x2
[v] Název druhého rozhraní, které objekt třídy odvozuje přímo.

COM_INTERFACE_ENTRY_AGGREGATE

Když se na rozhraní identifikované pomocí iid dotazuje, COM_INTERFACE_ENTRY_AGGREGATE přepošla na punk.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Parametry

Iid
[v] Identifikátor GUID rozhraní, pro které se dotazoval.

Punk
[v] Název IUnknown ukazatele.

Poznámky

Parametr punk se předpokládá tak, že odkazuje na vnitřní neznámou hodnotu agregace nebo hodnoty NULL, v takovém případě se položka ignoruje. Obvykle byste CoCreate agregaci v FinalConstruct.

Příklad

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

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

Stejné jako COM_INTERFACE_ENTRY_AGGREGATE, s tím rozdílem, že dotazování na jakékoli IID vede k předání dotazu punku.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Parametry

Punk
[v] Název IUnknown ukazatele.

Poznámky

Pokud dotaz rozhraní selže, zpracování mapování modelu COM bude pokračovat.

Příklad

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

Totéž jako COM_INTERFACE_ENTRY_AGGREGATE, s výjimkou případu, kdy punk je NULL, automaticky vytvoří agregaci popsanou clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Parametry

Iid
[v] Identifikátor GUID rozhraní, pro které se dotazoval.

Punk
[v] Název IUnknown ukazatele. Musí být členem třídy obsahující mapu MODELU COM.

Identifikátor clsid
[v] Identifikátor agregace, která se vytvoří, pokud má punk hodnotu NULL.

Poznámky

Příklad

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

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

Stejné jako COM_INTERFACE_ENTRY_AUTOAGGREGATE, s tím rozdílem, že dotazování na jakékoli IID vede k předání dotazu punku, a pokud má punk hodnotu NULL, automaticky vytvoří agregaci popsanou clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Parametry

Punk
[v] Název IUnknown ukazatele. Musí být členem třídy obsahující mapu MODELU COM.

Identifikátor clsid
[v] Identifikátor agregace, která se vytvoří, pokud má punk hodnotu NULL.

Poznámky

Pokud dotaz rozhraní selže, zpracování mapování modelu COM bude pokračovat.

Příklad

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

COM_INTERFACE_ENTRY_BREAK

Způsobí, že program bude volat DebugBreak při dotazování zadaného rozhraní.

COM_INTERFACE_ENTRY_BREAK(x)

Parametry

X
[v] Text použitý k vytvoření identifikátoru rozhraní.

Poznámky

Rozhraní IID se vytvoří připojením x k IID_. Pokud je IPersistStoragenapříklad x , bude IID_IPersistStorageIID .

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Uloží data specifická pro rozhraní pro každou instanci.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Parametry

Iid
[v] Identifikátor GUID rozhraní pro odtržování.

X
[v] Název třídy implementuje rozhraní.

Punk
[v] Název IUnknown ukazatele. Musí být členem třídy obsahující mapu MODELU COM. Měla by být inicializována na hodnotu NULL v konstruktoru objektu třídy.

Poznámky

Pokud se rozhraní nepoužívá, sníží se tím celková velikost instance objektu.

Příklad

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

Zpřístupňuje vaše rozhraní pro odtržení.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Parametry

Iid
[v] Identifikátor GUID rozhraní pro odtržování.

X
[v] Název třídy implementuje rozhraní.

Poznámky

Rozhraní pro odtržení se implementuje jako samostatný objekt, který se vytvoří při každém vytvoření instance rozhraní, na které se dotazuje. Rozhraní obvykle sestavíte jako odtržení, pokud se rozhraní používá zřídka, protože tím se uloží ukazatel vtable ve všech instancích hlavního objektu. Odtržení se odstraní, když se jeho počet odkazů změní na nulu. Třída, která implementuje odtržení, by měla být odvozena a CComTearOffObjectBase má svou vlastní mapu MODELU COM.

Příklad

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

Zpracovává mapování modelu COM základní třídy při zpracování dosáhne této položky v mapě MODELU COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Parametry

Classname
[v] Základní třída aktuálního objektu.

Poznámky

Například v následujícím kódu:

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

Všimněte si, že první položka v mapě modelu COM musí být rozhraní na objektu obsahujícím mapování MODELU COM. Nelze tedy začínat položky mapování modelu COM pomocí COM_INTERFACE_ENTRY_CHAIN, což způsobí, že se mapa modelu COM jiného objektu prohledá v okamžiku, kdy se v mapě modelu COM objektu zobrazí COM_INTERFACE_ENTRY_CHAIN(COtherObject). Pokud chcete nejprve prohledat mapu modelu COM jiného objektu, přidejte do mapy MODELU COM položku IUnknown rozhraní a pak zřetězte mapování modelu COM druhého objektu. Příklad:

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

COM_INTERFACE_ENTRY_FUNC

Obecný mechanismus pro připojení k logice QueryInterface KNIHOVNY ATL.

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Parametry

Iid
[v] Identifikátor GUID rozhraní vystaveného.

Dw
[v] Parametr předaný do funcu.

func
[v] Ukazatel funkce, který vrátí hodnotu iid.

Poznámky

Pokud iid odpovídá IID rozhraní dotazovaného na, funkce určená func je volána. Deklarace funkce by měla být:

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

Při zavolání pv funkce odkazuje na objekt třídy. Parametr riid odkazuje na dotazované rozhraní, je ukazatel na umístění, ppv kam má funkce uložit ukazatel na rozhraní, a dw je parametr, který jste zadali v položce. Funkce by měla nastavit * ppv na HODNOTU NULL a vrátit E_NOINTERFACE nebo S_FALSE, pokud se rozhodnete nevrací rozhraní. Při E_NOINTERFACE se zpracování mapování MODELU COM ukončí. Při S_FALSE pokračuje zpracování mapování modelu COM, i když nebyl vrácen žádný ukazatel rozhraní. Pokud funkce vrátí ukazatel rozhraní, měla by vrátit S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

Stejné jako COM_INTERFACE_ENTRY_FUNC, s tím rozdílem, že dotazování na jakékoli IID vede k volání func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Parametry

Dw
[v] Parametr předaný do funcu.

func
[v] Funkce, která se volá při zpracování této položky v mapě MODELU COM.

Poznámky

Jakékoli selhání způsobí, že zpracování bude pokračovat na mapě MODELU COM. Pokud funkce vrátí ukazatel rozhraní, měla by vrátit S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Vrátí E_NOINTERFACE a ukončí zpracování mapování modelu COM při dotazování zadaného rozhraní.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Parametry

X
[v] Text použitý k vytvoření identifikátoru rozhraní.

Poznámky

Toto makro můžete použít k zabránění použití rozhraní v konkrétním případě. Toto makro můžete například vložit do mapy MODELU COM přímo před COM_INTERFACE_ENTRY_AGGREGATE_BLIND, aby se dotaz na rozhraní nepřesměroval do vnitřního neznámého agregace.

Rozhraní IID se vytvoří připojením x k IID_. Pokud je IPersistStoragenapříklad x , bude IID_IPersistStorageIID .