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;
}
В этой функции я использую InternetQueryOption() с опцией INTERNET_OPTION_URL найти URL дескриптора hfile. Результат будет возвращен в URL [] и длина в Len.
Но функция всегда дает сбой и GetLastError() всегда возвращает 122 (ERROR_INSUFFICIENT_BUFFER).
В соответствии с этот, Максимальная возможная длина URL-адреса в IE составляет 2083, а я использую буфер длиной 3000. Итак, как эта ошибка возможна? Я даже сделал URL [] Глобальный, все та же ошибка.
Теперь, согласно IntenetQueryOption () документация, если GetLastError () возвращает ERROR_INSUFFICIENT_BUFFER, тогда переменная Len указывает на количество байтов, необходимое для хранения запрошенной информации (в данном случае это URL). И это значение всегда меньше, чем 100. Так как URL может не вписываться в ULR []?
В чем может быть причина этого странного поведения?
Пожалуйста помоги.
В соответствии с этим, максимальная возможная длина URL в IE составляет 2083, а я использую буфер длиной 3000. Так как же возможна эта ошибка? Я даже сделал url [] глобальным, все та же ошибка.
Просматривая код, вы объявляете буфер достаточно большим, но не общаетесь с InternetQueryOption
его размер, поэтому всегда возвращается ERROR_INSUFFICIENT_BUFFER
,
И это значение всегда меньше 100.
После вызова этой функции проверьте ее значение ДО.
С этой строкой:
DWORD *len = new DWORD;
Вы выделяете указатель на DWORD
но значение в указанной памяти неинициализировано (может быть 0, может быть 338, может быть 1234567, может привести к сбою приложения). Вы можете сохранить этот код, но вам нужно инициализировать память на правильное значение:
DWORD *len = new DWORD;
*len = sizeof(url);
ИМО здесь вам не нужно динамическое распределение, и вы можете просто изменить его на:
DWORD len = sizeof(url);
Теперь вы можете передать его адрес InternetQueryOption
, как это:
if (InternetQueryOption(hFile, INTERNET_OPTION_URL, url, &len) == FALSE) {
Не забудьте удалить delete len;
,