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

122 (ERROR_INSUFFICIENT_BUFFER)을 반환합니다. 결과는 url []으로, 길이는 len으로 반환됩니다.InternetQueryOption (..) 실패하고 GetLastError() 항상 내가 핸들 HFILE의 URL을 찾는 옵션 <strong>INTERNET_OPTION_URL</strong>와 <strong>InternetQueryOption</strong>()를 사용하고이 함수에서

그러나 항상 함수가 실패하고 GetLastError()은 항상 122 (ERROR_INSUFFICIENT_BUFFER)를 반환합니다.

길이가 3000 인 버퍼를 사용하는 동안 this에 따르면 IE에서 가능한 최대 길이는 2083입니다. 따라서이 오류는 어떻게 가능합니까? 나는 심지어 URL [으로 만들면서도 여전히 같은 오류가 발생합니다. GetLastError()가 ERROR_INSUFFICIENT_BUFFER를 반환하는 경우

이제 IntenetQueryOption() documentation에 따라, 다음, 요청 된 정보를 유지하는 데 필요한 바이트 수에 변수 포인트 (정보가 URL이 경우입니다). 그리고이 값은 항상 100보다 작습니다. URL은 어떻게 적합합니까? ulr []?

이 이상한 행동의 원인은 무엇일까요? 도와주세요.

+0

'DWORD * len = new DWORD;를 사용하는 대신'DWORD len = 3000;을 수행하고'InternetQueryOption (hFile, INTERNET_OPTION_URL, url, & len)'과 같은 함수를 호출해야합니다. –

답변

1

이렇게하면 길이 3000의 버퍼를 사용하는 동안 IE에서 가능한 최대 길이는 2083입니다.이 오류는 어떻게 가능합니까? 심지어 URL []을 전역으로 만들었지 만 여전히 같은 오류입니다.

이 코드를 찾아, 당신은 충분히 큰 버퍼를 선언하지만 InternetQueryOption 크기로 의사 소통을하지 않습니다 항상 ERROR_INSUFFICIENT_BUFFER를 반환, 그 이유입니다.

는 그리고이 값은 당신이 함수를 호출 한 후, 전에 그 값을 확인 미만 100

항상이다. 이 라인으로

:

DWORD *len = new DWORD; 

당신은 (당신의 응용 프로그램을 충돌 할 수 있습니다, 1234567 될 수있다, (338) 일 수 있으며, 0이 될 수 있음) 초기화되지 않은 한 뾰족한 메모리에 DWORD 포인터하지만 값을 할당합니다. 이 코드를 유지할 수 있지만 오른쪽 값으로 메모리를 초기화해야 : 당신이 어떤 동적 할당이 필요하지 않습니다

DWORD *len = new DWORD; 
*len = sizeof(url); 

IMO 여기 당신은 단순히 그것을 변경할 수 있습니다 : 이제

DWORD len = sizeof(url); 

을 수행 할 수 있습니다 이 같은 InternetQueryOption에 해당 주소를 전달합니다

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

delete len;을 제거하는 것을 잊지 마십시오.