Alterando associações para um componente
O subsistema de configuração de rede sempre informa um objeto de notificação sobre alterações na associação que afetam o componente de rede do objeto notify. O subsistema chama o método INetCfgComponentNotifyBinding::NotifyBindingPath do objeto notify e passa um valor que especifica a alteração junto com um ponteiro para a interface INetCfgBindingPath do caminho de associação envolvido na alteração. Se o subsistema passar NCN_DISABLE para desabilitar o caminho de associação que o componente de rede do objeto de notificação compartilha com uma rede específica cartão, o objeto notify poderá ativar a associação com outra rede cartão conforme mostrado no código a seguir.
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;
}