InternetQueryOption(..)失败,GetLastError()始终返回122(ERROR_INSUFFICIENT_BUFFER)

时间:2014-10-20 13:17:29

标签: c++ windows internet-explorer getlasterror system-error

void fn(HINTERNET hfile,...){
    char *url=new char[3000];
    DWORD *len = new DWORD;

    if(InternetQueryOption(hFile, INTERNET_OPTION_URL, url, len)==FALSE){    
        char* tmp=new char[3000];
        sprintf(temp, "InternetQueryOption failed!\nError: %d\nRequired bytes: %d\n", GetLastError(),*len);
        MessageBox(NULL, tmp, _T("myBHO !!!"), MB_OK | MB_ICONINFORMATION);
        delete [] tmp;
    }
    //....

    delete [] url;
    delete len;
}

在此函数中,我使用带有 INTERNET_OPTION_URL 选项的 InternetQueryOption ()来查找句柄hfile的URL。结果将在 url [] 中返回,长度在 len 中。

但是该函数总是失败, GetLastError ()总是返回122(ERROR_INSUFFICIENT_BUFFER)。

根据this,IE中可能的最大URL长度是2083,而我使用的是长度为3000的缓冲区。那么这个错误怎么可能呢?我甚至做了url [] 全局,仍然是同样的错误。

现在,根据IntenetQueryOption()documentation,如果GetLastError()返回ERROR_INSUFFICIENT_BUFFER,则变量 len 指向保存所请求信息所需的字节数(在本例中为信息是URL)。并且此值始终小于100.那么URL如何不适合 ulr []

这种奇怪行为可能是什么原因? 请帮忙。

1 个答案:

答案 0 :(得分:1)

  

根据这个,IE中可能的最大URL长度是2083,而我使用的是长度为3000的缓冲区。那么这个错误怎么可能呢?我甚至将url []设为全局,仍然是同样的错误。

浏览你的代码,你声明一个足够大的缓冲区,但你没有与InternetQueryOption的大小进行通信,这就是它总是返回ERROR_INSUFFICIENT_BUFFER的原因。

  

此值始终小于100.

调用该函数后,请检查其值BEFORE。

这一行:

DWORD *len = new DWORD;

您将指针分配给DWORD ,但指向的内存中的值未初始化(可能为0,可能为338,可能为1234567,可能会导致您的应用崩溃)。您可以保留此代码,但需要将内存初始化为正确的值:

DWORD *len = new DWORD;
*len = sizeof(url);

IMO在这里您不需要任何动态分配,您只需将其更改为:

DWORD len = sizeof(url);

现在您可以将其地址传递给InternetQueryOption,如下所示:

if (InternetQueryOption(hFile, INTERNET_OPTION_URL, url, &len) == FALSE) {

不要忘记删除delete len;