2012-06-04 60 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 –