GetAdaptersInfo的缓冲区大小

时间:2012-06-04 05:58:08

标签: c++ winapi

有关:

DWORD GetAdaptersInfo(
  __out    PIP_ADAPTER_INFO pAdapterInfo,
  __inout  PULONG pOutBufLen
);

pOutBufLen的说明如下:

  

pOutBufLen

     

[in,out]指向pAdapterInfo参数指示的缓冲区大小(以字节为单位)的指针。如果此大小不足以保存适配器信息,则此函数将填充具有所需大小的缓冲区,并返回错误代码ERROR_BUFFER_OVERFLOW。

现在我的问题是我们怎么知道缓冲区大小应该是什么,即pOutBufLen? 如果我们有超过16个NIC,那么正确的方法是什么?

来源msdn

1 个答案:

答案 0 :(得分:2)

使用它的常用方法是这样的:

IP_ADAPTER_INFO *buffer= NULL;
ULONG length = 0;

// call with length of 0. It'll fail, but tell us needed size.
GetAdaptersInfo(buffer, &length);

// allocate space needed.
buffer = malloc(length);

// Call again, with necessary size.
if (buffer != NULL)
    GetAdaptersInfo(bufer, &length);

至少在理论上,您应该在while循环中执行此操作,或者在该订单上执行此操作 - 调用,分配,再次调用,并继续重新分配和重新调用,直到成功为止。

这将使它(最终)成功,即使用户恰好在第一次和第二次调用之间插入网络适配器 ,所以即使你分配了它认为需要的空间在你第二次打电话之前,它就变得不够了。