Modifica delle associazioni per un componente
Il sottosistema di configurazione di rete informa sempre un oggetto di notifica sulle modifiche apportate all'associazione che influiscono sul componente di rete dell'oggetto notify. Il sottosistema chiama il metodo INetCfgComponentNotifyBinding::NotifyBindingPath dell'oggetto notify e passa un valore che specifica la modifica insieme a un puntatore all'interfaccia INetCfgBindingPath del percorso di associazione coinvolto nella modifica. Se il sottosistema passa NCN_DISABLE per disabilitare il percorso di associazione condiviso dal componente di rete dell'oggetto notify con una scheda di rete specifica, l'oggetto notify può attivare l'associazione con un'altra scheda di rete, come illustrato nel codice seguente.
HRESULT CSample::NotifyBindingPath(DWORD dwChangeFlag,
INetCfgBindingPath* pncbp1)
{
INetCfgComponent *pnccLow;
INetCfgComponentBindings *pncbind;
IEnumNetCfgBindingPath *penumncbp;
INetCfgBindingPath *pncbp2;
IEnumNetCfgBindingInterface *penumncbi;
INetCfgBindingInterface *pncbi;
DWORD dwFlags = EBP_BELOW;
ULONG celt = 1; // Request one enumeration element.
HRESULT hr = S_OK;
// Retrieve bindings for the notify object's component (m_pncc)
hr = m_pncc->QueryInterface(IID_INetCfgComponentBindings,
(LPVOID*)&pncbind);
// Determine if notification is about disabling a binding path.
if (SUCCEEDED(hr) && (NCN_DISABLE & dwChangeFlag)) {
// Retrieve enumerator for binding paths for the component.
hr = pncbind->EnumBindingPaths(dwFlags, &penumncbp);
// Reset the sequence and retrieve a binding path.
hr = penumncbp->Reset();
hr = penumncbp->Next(celt, &pncbp2, NULL);
// Ensure the binding path is different.
do {
if (pncbp1 != pncbp2) break;
hr = penumncbp->Skip(celt); // skip one element
hr = penumncbp->Next(celt, &pncbp2, NULL);
} while (SUCCEEDED(hr));
if (SUCCEEDED(hr)) {
// Retrieve enumerator for interfaces of the binding path.
hr = pncbp2->EnumBindingInterfaces(&penumncbi);
// Retrieve a binding interface for the binding path.
hr = penumncbi->Next(celt, &pncbi, NULL);
// Retrieve the lower network component.
hr = pncbi->GetLowerComponent(&pnccLow);
// If the component is a physical network card and binding
// is currently disabled, enable binding.
DWORD dwcc;
hr = pnccLow->GetCharacteristics(&dwcc);
if (SUCCEEDED(hr) && (dwcc & NCF_PHYSICAL)) {
hr = pncbp2->IsEnabled(); // S_FALSE for disabled
if (hr == S_FALSE) hr = pncbp2->Enable(TRUE);
}
}
else return hr;
}
return hr;
}