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)。
根据此,最大的URL长度可能在IE中是2083,而我使用长度3000的缓冲器,这怎么可能出错?我什至使url [] global,仍然是同样的错误。
现在,根据IntenetQueryOption()文档,如果GetLastError()返回ERROR_INSUFFICIENT_BUFFER,则变量len指向保存请求的信息所需的字节数(在这种情况下,信息为URL)。并且此值始终小于100。那么,URL如何不能容纳在ulr []中?
这种奇怪行为的原因可能是什么?请帮忙。
据此,当我使用长度为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;
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句