我在这里有一些用C++编写的遗留代码,可以完成一些我不了解的事情。我正在运行Windows XP的计算机上在Visual C++ 2008 Express Edition中运行它。

该代码使用一些Windows函数:GetAdaptersInfo和GetAdaptersAddressess。我意识到这两个参数的最后一个参数都是指向缓冲区大小的指针,并且由于它是in_out,因此可以在函数中进行更改。

我的问题是:这些函数是否应该更改缓冲区长度?

在我的代码中,每次调用这些函数时,缓冲区长度变量都会初始化为零,并且在调用该函数后,它仍为0。

最佳答案

您的代码需要看起来像这样:

// First get the desired size.
unsigned long outBufLen = 0;
DWORD dwResult = GetAdaptersInfo(NULL, &outBufLen);
if (dwResult == ERROR_BUFFER_OVERFLOW)  // This is what we're expecting
{
    // Now allocate a structure of the requried size.
    PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen);
    dwResult = GetAdaptersInfo(pIpAdapterInfo, &outBufLen);
    if (dwResult == ERROR_SUCCESS)
    {
        // Yay!

编辑:另请参阅Jeremy Friesner的答案,以了解为什么此代码还不够。

09-08 10:19