如何在Windows XP下启动并准备好networking接口时收到通知?
就绪意味着接口已经通过DHCP获得了一个networkingIP地址,并准备使用。
当一个界面准备就绪的时候你肯定可以得到一个事件! 只需使用IPHelper! 您应该寻找的功能是NotifyAddrChange http://msdn.microsoft.com/en-us/library/aa366329%28v=VS.85%29.aspx ,它是从Windows 2000开始可用。当适配器启动并运行,它将被分配一个IP地址,从而触发回调。
触发时可以使用GetAdapterAddress来计算所需的信息。 在Vista或以上有NotifyIpInterfaceChange直接告诉哪个适配器有IP变化。
您可以使用GetAdaptersAddresses接收所有适配器的状态,然后检查它是否启动或关闭。 你将不得不重复这个过程直到状态改变。 我不知道有什么方法可以收到通知。
ULONG nFlags = 0; DWORD dwVersion = ::GetVersion(); DWORD dwMajorVersion= (DWORD)(LOBYTE(LOWORD(dwVersion))); if (dwMajorVersion>=6) // flag supported in Vista and later nFlags= 0x0100; // GAA_FLAG_INCLUDE_ALL_INTERFACES*/ // during system initialization, GetAdaptersAddresses may return ERROR_BUFFER_OVERFLOW and supply nLen, // but in a subsequent call it may return ERROR_BUFFER_OVERFLOW and supply greater nLen ! ULONG nLen= sizeof (IP_ADAPTER_ADDRESSES); BYTE* pBuf= NULL; DWORD nErr= 0 ; do { delete[] pBuf; pBuf= new BYTE[nLen]; nErr= ::GetAdaptersAddresses(AF_INET, nFlags, NULL, (IP_ADAPTER_ADDRESSES*&)pBuf, &nLen); } while (ERROR_BUFFER_OVERFLOW == nErr); if (NO_ERROR != nErr) { delete[] pBuf; // report GetAdaptersAddresses failed return false; } const IP_ADAPTER_ADDRESSES* pAdaptersAddresses= (IP_ADAPTER_ADDRESSES*&)pBuf; while (pAdaptersAddresses) // for each adapter { // todo: check if this is your adapter... // pAdaptersAddresses->AdapterName // pAdaptersAddresses->Description // pAdaptersAddresses->FriendlyName const IF_OPER_STATUS& Stat= pAdaptersAddresses->OperStatus; // 1:up, 2:down... pAdaptersAddresses= pAdaptersAddresses->Next; } delete[] pBuf; return false;
而且,对于每个适配器,您都可以在注册表中搜索它的IP地址。 这将在SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces ## ADAPTERNAME ##,是## ADAPTERNAME ##是IP_ADAPTER_ADDRESSES结构的AdapterName成员。 检查EnableDHCP以查找它是否是动态地址,然后查看DhcpIPAddress项。