【问题标题】:Buffer size for GetAdaptersInfoGetAdaptersInfo 的缓冲区大小
【发布时间】:2012-06-04 05:58:07
【问题描述】:

为:

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

pOutBufLen的描述如下:

pOutBufLen

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

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

来源msdn

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    通常的使用方式是这样的:

    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 循环中执行此操作,或者按此顺序执行此操作 - 调用、分配、再次调用,然后继续重新分配和重新调用,直到成功。

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

    【讨论】:

    • 不要忘记从 malloc 中转换返回值,因为它被标记为 C++。
    • 是的,我知道,感谢您的提醒 :) (PIP_ADAPTER_INFO) malloc(dwBufLen) 即如果我们使用 PIP_ADAPTER_INFO 而不是 IP_ADAPTER_INFO
    猜你喜欢
    • 2020-09-05
    • 2014-06-10
    • 2015-06-05
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多