HttpQueryServiceConfiguration总是返回ERROR_INSUFFICIENT_BUFFER

时间:2016-01-27 08:35:58

标签: c++

#include "stdafx.h"
#include "Http.h"
#pragma comment (lib,"Httpapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    HTTPAPI_VERSION HttpApiVersion = HTTPAPI_VERSION_1;
    ULONG ret = NO_ERROR;
    HRESULT hr = S_OK;
    HTTPAPI_VERSION ver = HTTPAPI_VERSION_1;
    ret = HttpInitialize(ver,HTTP_INITIALIZE_SERVER|HTTP_INITIALIZE_CONFIG,NULL);
    if(ret!=NO_ERROR)
    {
        return 0;
    }

    HTTP_SERVICE_CONFIG_ID configId = HttpServiceConfigIPListenList;
    HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY* query=NULL;
    ULONG size=1000;
    ULONG re = HttpQueryServiceConfiguration(NULL,configId,NULL,NULL,query,NULL,&size,NULL);
    printf("re = %d",re);
    getchar();
    return 0;
}

此结果始终为122(ERROR_INSUFFICIENT_BUFFER)。我不知道共鸣。 这是HttpQueryServiceConfiguration函数的链接: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364491

1 个答案:

答案 0 :(得分:1)

根据您链接的引用,作为指向函数的指针传递的sizepReturnLength,这是输出参数,并且是

  

指向接收要在输出缓冲区中写入的字节数的变量的指针。

[强调我的]

您提供的缓冲区大小位于OutputConfigInfoLength参数之前的参数中。当然,如果你想要写一些数据,你需要实际提供一个存储它的缓冲区,然后传递NULL作为该参数(query初始化为NULL)。

另请注意,如果函数失败并显示ERROR_INSUFFICIENT_BUFFER,则传递为pReturnLength的变量将包含函数成功所需的实际长度。所以你应该做的是首先用零缓冲区大小调用它,以获得所需的大小,然后再次调用它来实际获取信息。

这样的东西
HTTP_SERVICE_CONFIG_ID configId = HttpServiceConfigIPListenList;
ULONG size;
ULONG re = HttpQueryServiceConfiguration(NULL,configId,NULL,0,NULL,0,&size,NULL);

if (re != ERROR_INSUFFICIENT_BUFFER)
{
    // We got an unknown error, handle it
}
else
{
    // Allocate a buffer big enough for the data
    HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY* query =
        reinterpret_cast<HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY*>(new char[size]);

    // Call the function again
    re = HttpQueryServiceConfiguration(NULL,configId,NULL,0,query,size,&size,NULL);

    // Here you should have the information you want in `query`
    // Use the data

    // Free the memory
    delete[] query;
}