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.
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.
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 IPersistStorage
například x , bude IID_IPersistStorage
IID .
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 IPersistStorage
například x , bude IID_IPersistStorage
IID .