2015-07-06 5 views
1

Я использую WinInet и InternetOpenUrl, чтобы загрузить файл ... который работает. Но я хочу, чтобы следить за прогрессом, так что я пытался добавить функцию обратного вызова, но по какой-то причине он никогда не называл ...C++ WinInet и Callback не работают

Код:

void CALLBACK DownloadProgress(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength) 
{ 
    // this function never gets called 
    MessageBox(NULL, L"test", L"test", MB_OK); 
} 

void Download() 
{ 
    HINTERNET hOpen = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0); 
    InternetSetStatusCallback(hOpen, DownloadProgress); 
    HINTERNET hOpenUrl = InternetOpenUrl(hOpen, L"http://www.website.com/test.txt", 0, 0, 0, 0); 

    // small edit 

    InternetReadFile(hOpenUrl, data, SIZE, &size); 
} 

Что я здесь делаю неправильно?

ответ

2

От MSDN:

INTERNET_STATUS_CALLBACK InternetSetStatusCallback(
    _In_ HINTERNET    hInternet, 
    _In_ INTERNET_STATUS_CALLBACK lpfnInternetCallback 
); 

Примечание Функция обратного вызова, указанный в параметре lpfnInternetCallback не будет вызываться на асинхронных операций для запроса ручки, когда параметр dwContext из HttpOpenRequest является установите в ноль (INTERNET_NO_CALLBACK) или ручку соединения, когда dwContext handle of InternetConnect установлен на ноль (INTERNET_NO_CALLBACK).

В вашем случае, вы используете InternetOpenUrl (после вызова InternetOpen), который является простой альтернативой для работы с URL-адресами, если вам не нужно, чтобы получить доступ к сведению о протоколе. Синтаксис:

HINTERNET InternetOpenUrl(
    _In_ HINTERNET hInternet, 
    _In_ LPCTSTR lpszUrl, 
    _In_ LPCTSTR lpszHeaders, 
    _In_ DWORD  dwHeadersLength, 
    _In_ DWORD  dwFlags, 
    _In_ DWORD_PTR dwContext 
); 

dwContext является приложением определенного значения, который передается функции обратного вызова, зарегистрированного InternetSetStatusCallback. Используется для определения контекста приложения.

Обратите внимание, что вы передаете dwContext=0 этой функции в свой код. Если вы измените это, ваш код будет работать так, как вы ожидаете.

+0

Спасибо, это помогло – user5062925

 Смежные вопросы

  • Нет связанных вопросов^_^