InternetQueryOption (..) завершается ошибкой, а GetLastError () всегда возвращает 122 (ERROR_INSUFFICIENT_BUFFER)

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 []?

В чем может быть причина этого странного поведения?
Пожалуйста помоги.

1

Решение

В соответствии с этим, максимальная возможная длина 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;,

1

Другие решения


По вопросам рекламы [email protected]