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


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: %dnRequired bytes: %dn", 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(。

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

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

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

据此,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; .

相关内容

  • 没有找到相关文章

最新更新