我会使用 Windows 的 GetAdaptersAddresses()
函数来获取有关计算机适配器的一些信息。在 this MSDN 页面有一个很大的例子说明如何使用它。但我使用的是 C++,所以我会坚持使用 new
关键字而不是 malloc
(C native)。如何用 new
重写使用 malloc
的部分?
编辑 1
std::vector<PIP_ADAPTER_ADDRESSES> buffer;
ULONG outBufferLen = 0;
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
buffer.resize(outBufferLen);
PIP_ADAPTER_ADDRESSES addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, addresses, &outBufferLen) == NO_ERROR)
{
for (; addresses != NULL; addresses = addresses->Next)
{
...
}
}
}
编辑 2
ULONG outBufferLen = 0;
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
PIP_ADAPTER_ADDRESSES p = new IP_ADAPTER_ADDRESSES[outBufferLen / sizeof(IP_ADAPTER_ADDRESSES)];
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, p, &outBufferLen) == NO_ERROR)
{
....
}
}
最佳答案
您不能使用new
/delete
直接重写该代码,因为引入new
会引发异常风险,而该代码不会异常安全。一个愚蠢的方法是调用 ::operator new(size_t, const nothrow_t&)
而不是 malloc()
- 但这真的很难看。
真正的解决方案是使用适当的 C++ 类重写所有代码。 std::vector
非常适合pAddresses
,您需要一个用于 lpMsgBuf
的 RAII 包装器。
关于c++ - 使用 NEW 而不是 MALLOC 的 GetAdapterAddresses 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8259439/