1
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)。

据此,当我使用长度为 3000 的缓冲区时,IE 中可能的最大 URL 长度为 2083。那么这个错误怎么可能发生我什至做了 url[] global,仍然是同样的错误。

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

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

4

1 回答 1

1

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

浏览你的代码,你声明了一个足够大的缓冲区,但你没有传达InternetQueryOption它的大小,这就是它总是返回的原因ERROR_INSUFFICIENT_BUFFER

而且这个值总是小于 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;.

于 2014-10-20T13:23:12.737 回答