2014-10-20 8 views
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; 
} 

В этой функции я использую InternetQueryOption() с опцией INTERNET_OPTION_URL найти URL дескриптора hfile. Результат будет возвращен в URL [] и длина в len.InternetQueryOption (..) терпит неудачу и GetLastError() всегда возвращает 122 (ERROR_INSUFFICIENT_BUFFER)

Но функция всегда терпит неудачу и GetLastError() всегда возвращает 122 (ERROR_INSUFFICIENT_BUFFER).

Согласно this, максимальная длина URL-адреса в IE составляет 2083, тогда как я использую буфер длиной 3000. Так как же эта ошибка возможна? Я даже сделал url [] глобальный, все та же ошибка.

Теперь, согласно IntenetQueryOption() documentation, если GetLastError() возвращает ERROR_INSUFFICIENT_BUFFER, то переменная Len указывает на количество байтов, необходимых для хранения требуемой информации (в данном случае информация URL). И это значение всегда меньше 100. Так как URL может не соответствовать ulr []?

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

+0

Вместо использования 'DWORD * len = new DWORD;' вы должны сделать 'DWORD len = 3000;' и вызвать функцию следующим образом: 'InternetQueryOption (hFile, INTERNET_OPTION_URL, url, & len)'. –

ответ

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); 

IMO здесь вам не нужны какие-либо динамическое распределение и вы можете просто изменить его на:

DWORD len = sizeof(url); 

Теперь вы можете передать его адрес InternetQueryOption, как это:

if (InternetQueryOption(hFile, INTERNET_OPTION_URL, url, &len) == FALSE) { 

не забудьте удалить delete len;.