c++ - InternetQueryOption(..) 失败并且 GetLastError() 总是返回 122 (ERROR_INSUFFICIENT_BUFFER)

标签 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_URLInternetQueryOption() 来查找句柄 hfile 的 URL。结果将在 url[] 中返回,长度在 len 中返回。

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

根据 this ,当我使用长度为 3000 的缓冲区时,IE 中可能的最大 URL 长度为 2083。那么这个错误怎么可能呢?我什至把url[]设为global,还是一样的错误。

现在,根据 IntenetQueryOption() documentation ,如果 GetLastError() 返回 ERROR_INSUFFICIENT_BUFFER,则变量 len 指向保存所请求信息所需的字节数(在本例中信息为 URL)。而且这个值总是小于 100。那么 URL 怎么会放不下 ulr[] 呢?

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

最佳答案

According to this, maximum URL length possible in IE is 2083 while I am using buffer of length 3000. So how is this error possible? I even made url[] global, still the same error.

浏览您的代码,您声明了一个足够大的缓冲区,但您没有将其大小告知 InternetQueryOption,这就是它总是返回 ERROR_INSUFFICIENT_BUFFER 的原因。

And this value is always less than 100.

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

用这一行:

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;

关于c++ - InternetQueryOption(..) 失败并且 GetLastError() 总是返回 122 (ERROR_INSUFFICIENT_BUFFER),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466658/

相关文章:

css - 网站在除 IE 以外的其他浏览器中看起来正常

c++ - 基于编译器选项的已编译二进制路径

python - 卡住脚本中的多处理 python

python - 为什么 python 和 py 命令运行不同的 python 3 版本?

c# - 保持应用程序始终运行

jquery - 在 jQuery 中将下拉列表最大高度限制为屏幕高度

html - IE7 中的 UL 对齐问题

C++预处理器位置代码:: block ?

c++ - 如何确定输入文件中的一行是否是最后一行? C++

c++ - 是否在COPYING中包括如何使用GPL?