Changing Bindings for a Component
The network configuration subsystem always informs a notify object about changes in binding that affect the notify object's network component. The subsystem calls the notify object's INetCfgComponentNotifyBinding::NotifyBindingPath method and passes a value that specifies the change along with a pointer to the INetCfgBindingPath interface of the binding path involved in the change. If the subsystem passes NCN_DISABLE to disable the binding path that the notify object's network component shares with a specific network card, the notify object can activate the binding with another network card as shown in the following code.
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;
}