Classe CConnectionPoint
Definisce un tipo speciale di interfaccia utilizzata per comunicare con altri oggetti OLE, denominata "punto di connessione".
Sintassi
class CConnectionPoint : public CCmdTarget
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
CConnectionPoint::CConnectionPoint | Costruisce un oggetto CConnectionPoint . |
Metodi pubblici
Nome | Descrizione |
---|---|
CConnectionPoint::GetConnections | Recupera tutti i punti di connessione in una mappa di connessione. |
CConnectionPoint::GetContainer | Recupera il contenitore del controllo proprietario della mappa di connessione. |
CConnectionPoint::GetIID | Recupera l'ID interfaccia di un punto di connessione. |
CConnectionPoint::GetMaxConnections | Recupera il numero massimo di punti di connessione supportati da un controllo . |
CConnectionPoint::GetNextConnection | Recupera un puntatore all'elemento di connessione in corrispondenza di pos. |
CConnectionPoint::GetStartPosition | Avvia un'iterazione della mappa restituendo un valore POSITION che può essere passato a una GetNextConnection chiamata. |
CConnectionPoint::OnAdvise | Chiamato dal framework durante la creazione o l'interruzione delle connessioni. |
CConnectionPoint::QuerySinkInterface | Recupera un puntatore all'interfaccia sink richiesta. |
Osservazioni:
A differenza delle normali interfacce OLE, usate per implementare ed esporre la funzionalità di un controllo OLE, un punto di connessione implementa un'interfaccia in uscita in grado di avviare azioni su altri oggetti, ad esempio la generazione di eventi e le notifiche di modifica.
Una connessione è costituita da due parti: l'oggetto che chiama l'interfaccia, denominata "origine" e l'oggetto che implementa l'interfaccia, denominata "sink". Esponendo un punto di connessione, un'origine consente ai sink di stabilire connessioni a se stesso. Tramite il meccanismo del punto di connessione, un oggetto di origine ottiene un puntatore all'implementazione del sink di un set di funzioni membro. Ad esempio, per generare un evento implementato dal sink, l'origine può chiamare il metodo appropriato dell'implementazione del sink.
Per impostazione predefinita, una COleControl
classe derivata da -implementa due punti di connessione: uno per gli eventi e uno per le notifiche di modifica delle proprietà. Queste connessioni vengono usate, rispettivamente, per la generazione di eventi e per notificare un sink (ad esempio, il contenitore del controllo) quando un valore della proprietà è stato modificato. Viene inoltre fornito il supporto per i controlli OLE per implementare punti di connessione aggiuntivi. Per ogni punto di connessione aggiuntivo implementato nella classe di controllo, è necessario dichiarare una "parte di connessione" che implementa il punto di connessione. Se si implementano uno o più punti di connessione, è anche necessario dichiarare una singola "mappa di connessione" nella classe di controllo.
Nell'esempio seguente viene illustrata una semplice mappa di connessione e un punto di connessione per il Sample
controllo OLE, costituito da due frammenti di codice: la prima parte dichiara la mappa di connessione e il punto. La seconda implementa la mappa e il punto. Il primo frammento viene inserito nella dichiarazione della classe del controllo, nella protected
sezione :
// Connection point for ISample interface
BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
CONNECTION_IID(IID_ISampleSink)
END_CONNECTION_PART(SampleConnPt)
DECLARE_CONNECTION_MAP()
Le macro BEGIN_CONNECTION_PART e END_CONNECTION_PART dichiarano una classe incorporata ( XSampleConnPt
derivata da CConnectionPoint
) che implementa questo particolare punto di connessione. Se si desidera eseguire l'override di qualsiasi CConnectionPoint
funzione membro o aggiungere funzioni membro personalizzate, dichiararle tra queste due macro. Ad esempio, la macro CONNECTION_IID esegue l'override della CConnectionPoint::GetIID
funzione membro quando viene posizionata tra queste due macro.
Il secondo frammento di codice viene inserito nel file di implementazione (. CPP) della classe di controllo. Questo codice implementa la mappa di connessione, che include il punto di connessione aggiuntivo, SampleConnPt
:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
Dopo l'inserimento di questi frammenti di codice, il controllo OLE di esempio espone un punto di connessione per l'interfaccia ISampleSink
.
In genere, i punti di connessione supportano il "multicast", ovvero la possibilità di trasmettere a più sink connessi alla stessa interfaccia. Il frammento di codice seguente illustra come eseguire il multicast eseguendo l'iterazione di ogni sink in un punto di connessione:
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink *pSampleSink;
while (pos != NULL)
{
pSampleSink = (ISampleSink *)(m_xSampleConnPt.GetNextConnection(pos));
if (pSampleSink != NULL)
{
pSampleSink->SinkFunc();
}
}
}
In questo esempio viene recuperato il set corrente di connessioni nel SampleConnPt
punto di connessione con una chiamata a CConnectionPoint::GetConnections
. Scorre quindi le connessioni e chiama ISampleSink::SinkFunc
su ogni connessione attiva.
Per altre informazioni sull'uso CConnectionPoint
di , vedere l'articolo Punti di connessione.
Gerarchia di ereditarietà
CConnectionPoint
Requisiti
Intestazione: afxdisp.h
CConnectionPoint::CConnectionPoint
Costruisce un oggetto CConnectionPoint
.
CConnectionPoint();
CConnectionPoint::GetConnections
Chiamare questa funzione per recuperare tutte le connessioni attive per un punto di connessione.
const CPtrArray* GetConnections();
Valore restituito
Puntatore a una matrice di connessioni attive (sink). Alcuni puntatori nella matrice possono essere NULL. Ogni puntatore non NULL in questa matrice può essere convertito in modo sicuro in un puntatore all'interfaccia sink usando un operatore cast.
CConnectionPoint::GetContainer
Chiamato dal framework per recuperare l'oggetto IConnectionPointContainer
per il punto di connessione.
virtual LPCONNECTIONPOINTCONTAINER GetContainer();
Valore restituito
In caso di esito positivo, un puntatore al contenitore; in caso contrario NULL.
Osservazioni:
Questa funzione viene in genere implementata dalla macro BEGIN_CONNECTION_PART.
CConnectionPoint::GetIID
Chiamato dal framework per recuperare l'ID interfaccia di un punto di connessione.
virtual REFIID GetIID() = 0;
Valore restituito
Riferimento all'ID dell'interfaccia del punto di connessione.
Osservazioni:
Eseguire l'override di questa funzione per restituire l'ID interfaccia per questo punto di connessione.
CConnectionPoint::GetMaxConnections
Chiamato dal framework per recuperare il numero massimo di connessioni supportate dal punto di connessione.
virtual int GetMaxConnections();
Valore restituito
Numero massimo di connessioni supportate dal controllo oppure -1 se non è previsto alcun limite.
Osservazioni:
L'implementazione predefinita restituisce -1, che indica che non è previsto alcun limite.
Eseguire l'override di questa funzione se si desidera limitare il numero di sink che possono connettersi al controllo.
CConnectionPoint::GetNextConnection
Recupera un puntatore all'elemento di connessione in corrispondenza di pos.
LPUNKNOWN GetNextConnection(POSITION& pos) const;
Parametri
pos
Specifica un riferimento a un valore POSITION restituito da una chiamata precedente GetNextConnection
o GetStartPosition .
Valore restituito
Puntatore all'elemento di connessione specificato da pos o NULL.
Osservazioni:
Questa funzione è più utile per scorrere tutti gli elementi nella mappa di connessione. Durante l'iterazione, ignorare gli eventuali valori NULL restituiti da questa funzione.
Esempio
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink *pSampleSink;
while (pos != NULL)
{
pSampleSink = (ISampleSink *)(m_xSampleConnPt.GetNextConnection(pos));
if (pSampleSink != NULL)
{
pSampleSink->SinkFunc();
}
}
}
CConnectionPoint::GetStartPosition
Avvia un'iterazione della mappa restituendo un valore POSITION che può essere passato a una chiamata GetNextConnection .
POSITION GetStartPosition() const;
Valore restituito
Valore POSITION che indica una posizione iniziale per l'iterazione della mappa; o NULL se la mappa è vuota.
Osservazioni:
La sequenza di iterazione non è prevedibile; pertanto, il "primo elemento nella mappa" non ha un significato speciale.
Esempio
Vedere l'esempio per CConnectionPoint::GetNextConnection.
CConnectionPoint::OnAdvise
Chiamato dal framework quando viene stabilita o interrotta una connessione.
virtual void OnAdvise(BOOL bAdvise);
Parametri
bAdvise
TRUE, se viene stabilita una connessione; in caso contrario FALSE.
Osservazioni:
L'implementazione predefinita non esegue alcuna operazione.
Eseguire l'override di questa funzione se si vuole notificare quando i sink si connettono o si disconnettono dal punto di connessione.
CConnectionPoint::QuerySinkInterface
Recupera un puntatore all'interfaccia sink richiesta.
virtual HRESULT QuerySinkInterface(
LPUNKNOWN pUnkSink,
void** ppInterface);
Parametri
pUnkSink
Identificatore dell'interfaccia sink richiesta.
ppInterface
Puntatore al puntatore dell'interfaccia identificato da pUnkSink. Se l'oggetto non supporta questa interfaccia, * ppInterface è impostato su NULL.
Valore restituito
Valore HRESULT standard.