Mappe di connessione
I controlli OLE sono in grado di esporre interfacce ad altre applicazioni. Queste interfacce consentono l'accesso solo da un contenitore a tale controllo. Se un controllo OLE desidera accedere a interfacce esterne di altri oggetti OLE, deve essere stabilito un punto di connessione. Questo punto di connessione consente un controllo dell'accesso in uscita alle mappe dispatch esterne, ad esempio mappe eventi o funzioni di notifica.
Microsoft Foundation Class Library offre un modello di programmazione che supporta i punti di connessione. In questo modello vengono usate "mappe di connessione" per designare interfacce o punti di connessione per il controllo OLE. Le mappe di connessione contengono una macro per ogni punto di connessione. Per altre informazioni sulle mappe di connessione, vedere la CConnectionPoint
classe .
In genere, un controllo supporta solo due punti di connessione: uno per gli eventi e uno per le notifiche delle proprietà. Questi vengono implementati dalla COleControl
classe base e non richiedono alcun lavoro aggiuntivo dal writer di controlli. Tutti gli altri punti di connessione che si desidera implementare nella classe devono essere aggiunti manualmente. Per supportare mappe e punti di connessione, MFC fornisce le macro seguenti:
Dichiarazione e demarcazione della mappa delle connessioni
Nome | Descrizione |
---|---|
BEGIN_CONNECTION_PART |
Dichiara una classe incorporata che implementa un punto di connessione aggiuntivo (deve essere usata nella dichiarazione di classe). |
END_CONNECTION_PART |
Termina la dichiarazione di un punto di connessione (deve essere usata nella dichiarazione di classe). |
CONNECTION_IID |
Specifica l'ID interfaccia del punto di connessione del controllo. |
DECLARE_CONNECTION_MAP |
Dichiara che una mappa di connessione verrà usata in una classe (deve essere usata nella dichiarazione di classe). |
BEGIN_CONNECTION_MAP |
Inizia la definizione di una mappa di connessione (deve essere usata nell'implementazione della classe). |
END_CONNECTION_MAP |
Termina la definizione di una mappa di connessione (deve essere usata nell'implementazione della classe). |
CONNECTION_PART |
Specifica un punto di connessione nella mappa di connessione del controllo. |
Le funzioni seguenti consentono a un sink di stabilire e disconnettere una connessione usando i punti di connessione:
Inizializzazione/terminazione dei punti di connessione
Nome | Descrizione |
---|---|
AfxConnectionAdvise |
Stabilisce una connessione tra un'origine e un sink. |
AfxConnectionUnadvise |
Interrompe una connessione tra un'origine e un sink. |
BEGIN_CONNECTION_PART
Utilizzare la BEGIN_CONNECTION_PART
macro per iniziare la definizione di punti di connessione aggiuntivi oltre i punti di connessione di notifica degli eventi e delle proprietà.
BEGIN_CONNECTION_PART(theClass, localClass)
Parametri
theClass
Specifica il nome della classe del controllo il cui punto di connessione è.
localClass
Specifica il nome della classe locale che implementa il punto di connessione.
Osservazioni:
Nel file di dichiarazione (.h
) che definisce le funzioni membro per la classe avviare il punto di connessione con la BEGIN_CONNECTION_PART
macro. Aggiungere quindi la CONNECTION_IID
macro e tutte le altre funzioni membro da implementare. Completare infine la mappa del punto di connessione con la END_CONNECTION_PART
macro.
Requisiti
Intestazione afxdisp.h
END_CONNECTION_PART
Termina la dichiarazione del punto di connessione.
END_CONNECTION_PART(localClass)
Parametri
localClass
Specifica il nome della classe locale che implementa il punto di connessione.
Requisiti
Intestazione afxdisp.h
CONNECTION_IID
Utilizzare tra le BEGIN_CONNECTION_PART
macro e END_CONNECTION_PART
per definire un ID di interfaccia per un punto di connessione supportato dal controllo OLE.
CONNECTION_IID(iid)
Parametri
iid
ID dell'interfaccia chiamata dal punto di connessione.
Osservazioni:
L'argomento iid
è un ID di interfaccia usato per identificare l'interfaccia che il punto di connessione chiama nei sink connessi. Ad esempio:
CONNECTION_IID(IID_ISampleSink)
Specifica un punto di connessione che chiama l'interfaccia ISinkInterface
.
Requisiti
Intestazione afxdisp.h
DECLARE_CONNECTION_MAP
Ogni COleControl
classe derivata dal programma può fornire una mappa di connessione per specificare punti di connessione aggiuntivi supportati dal controllo.
DECLARE_CONNECTION_MAP()
Osservazioni:
Se il controllo supporta punti aggiuntivi, usare la DECLARE_CONNECTION_MAP
macro alla fine della dichiarazione di classe. Quindi, nel file di .cpp che definisce le funzioni membro per la classe, utilizzare la BEGIN_CONNECTION_MAP
macro, CONNECTION_PART
le macro per ognuno dei punti di connessione del controllo e la END_CONNECTION_MAP
macro per dichiarare la fine della mappa di connessione.
Requisiti
Intestazione afxdisp.h
BEGIN_CONNECTION_MAP
Ogni classe derivata da COleControl
nel programma può fornire una mappa di connessioni per specificare i punti di connessione che il controllo supporterà.
BEGIN_CONNECTION_MAP(theClass, theBase)
Parametri
theClass
Specifica il nome della classe del controllo a cui appartiene la mappa delle connessioni.
theBase
Specifica il nome della classe base di theClass
.
Osservazioni:
Nel file di implementazione (.CPP
) che definisce le funzioni membro per la classe avviare la mappa di connessione con la BEGIN_CONNECTION_MAP
macro, quindi aggiungere voci di macro per ognuno dei punti di connessione usando la CONNECTION_PART
macro. Completare infine la mappa di connessione con la END_CONNECTION_MAP
macro.
Requisiti
Intestazione afxdisp.h
END_CONNECTION_MAP
Termina la definizione della mappa delle connessioni.
END_CONNECTION_MAP()
Requisiti
Intestazione afxdisp.h
CONNECTION_PART
Esegue il mapping di un punto di connessione per il controllo OLE a un ID di interfaccia specifico.
CONNECTION_PART(theClass, iid, localClass)
Parametri
theClass
Specifica il nome della classe del controllo il cui punto di connessione è.
iid
ID dell'interfaccia chiamata dal punto di connessione.
localClass
Specifica il nome della classe locale che implementa il punto di connessione.
Osservazioni:
Ad esempio:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
implementa una mappa di connessione, con un punto di connessione, che chiama l'interfaccia IID_ISinkInterface
.
Requisiti
Intestazione afxdisp.h
AfxConnectionAdvise
Chiamare questa funzione per stabilire una connessione tra un'origine, specificata da pUnkSrc
e un sink, specificato da pUnkSink
.
BOOL AFXAPI AfxConnectionAdvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD FAR* pdwCookie);
Parametri
pUnkSrc
Puntatore all'oggetto che chiama l'interfaccia.
pUnkSink
Puntatore all'oggetto che implementa l'interfaccia .
iid
ID dell'interfaccia della connessione.
bRefCount
Per le connessioni out-of-process, questo parametro deve essere TRUE
e indica che la creazione della connessione deve comportare l'incremento del conteggio dei riferimenti di pUnkSink
.
Per le connessioni in-process, TRUE
indica che la creazione della connessione deve comportare l'incremento del numero di riferimenti di pUnkSink
. FALSE
indica che il conteggio dei riferimenti non deve essere incrementato.
Avviso: in generale, non è possibile prevedere quali connessioni sono in-process e quali connessioni sono out-of-process, quindi è consigliabile impostare sempre questo parametro su TRUE
.
pdwCookie
Puntatore a un oggetto DWORD
in cui viene restituito un identificatore di connessione. Questo valore deve essere passato come dwCookie
parametro a AfxConnectionUnadvise
quando si disconnette la connessione.
Valore restituito
Diverso da zero se è stata stabilita una connessione; in caso contrario, 0.
Esempio
//CMySink is a CCmdTarget-derived class supporting automation.
//Instantiate the sink class.
CMySink mysink;
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Establish a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a cookie identifying the connection, and is needed
//to terminate this connection.
AfxConnectionAdvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, &dwCookie);
Requisiti
Intestazione: afxctl.h
AfxConnectionUnadvise
Chiamare questa funzione per disconnettere una connessione tra un'origine, specificata da pUnkSrc
e un sink, specificato da pUnkSink
.
BOOL AFXAPI AfxConnectionUnadvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD dwCookie);
Parametri
pUnkSrc
Puntatore all'oggetto che chiama l'interfaccia.
pUnkSink
Puntatore all'oggetto che implementa l'interfaccia .
iid
ID interfaccia dell'interfaccia del punto di connessione.
bRefCount
Per le connessioni out-of-process, questo parametro deve essere TRUE
e indica che la creazione della connessione deve causare la decrementazione del conteggio dei riferimenti di pUnkSink
.
Per le connessioni in-process, TRUE
indica che la creazione della connessione deve causare la decrementazione del numero di riferimenti di pUnkSink
. FALSE
indica che il conteggio dei riferimenti non deve essere decrementato.
Avviso: in generale, non è possibile prevedere quali connessioni sono in-process e quali connessioni sono out-of-process, quindi è consigliabile impostare sempre questo parametro su TRUE
.
dwCookie
Identificatore di connessione restituito da AfxConnectionAdvise
.
Valore restituito
Diverso da zero se una connessione è stata disconnessa; in caso contrario, 0.
Esempio
//mysink is a CCmdTarget-derived class supporting automation.
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Terminate a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a value obtained through AfxConnectionAdvise().
AfxConnectionUnadvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, dwCookie);
Requisiti
Intestazione: afxctl.h