2012-06-04 189 views
1

对于:缓冲区大小为GetAdaptersInfo

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

pOutBufLen的描述如下:

pOutBufLen

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

现在我的问题是,我们怎么才能知道应该是什么样的缓冲区大小,即pOutBufLen? 如果我们有16个以上的网卡,那么正确的方法是什么?

来源msdn

回答

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循环,或者说为了的东西 - 呼叫,分配,再次呼叫,并继续重新分配和重新呼叫,直到它成功。

这将让它(最终)成功,即使用户发生在一个网络适配器的第一和第二呼叫之间只是堵塞,所以即使你分配它认为将需要的空间,它变得不足然后才能进行第二次通话。

+0

哦,所以该功能有两种方式。 伟大的答案,谢谢:) –

+0

不要忘记从malloc投下返回,因为这是标记为C++。 –

+0

是的,我知道,谢谢你的头像:) (PIP_ADAPTER_INFO)malloc(dwBufLen)即,如果我们使用PIP_ADAPTER_INFO而不是IP_ADAPTER_INFO –