C ++ WinInet和Callback不起作用

时间:2015-07-06 23:05:33

标签: c++ wininet

我正在使用WinInetInternetOpenUrl下载文件......这是有效的。但我想监视进度,所以我尝试添加一个回调函数但由于某种原因它从未被调用...

代码:

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

来自MSDN

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

注意 lpfnInternetCallback中指定的回调函数   在异步操作中不会调用参数   设置HttpOpenRequest的 dwContext参数时的请求句柄   为零(INTERNET_NO_CALLBACK),或连接句柄时   InternetConnect的 dwContext句柄设置为零   (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传递给此函数。如果你改变它,你的代码将按预期工作。