C++ WinInet 和回调不工作

C++ WinInet and Callback isn't working

我正在使用 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);
}

我做错了什么?

来自MSDN

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

Note The callback function specified in the lpfnInternetCallback parameter will not be called on asynchronous operations for the request handle when the dwContext parameter of HttpOpenRequest is set to zero (INTERNET_NO_CALLBACK), or the connection handle when the dwContext handle of InternetConnect is set to zero (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 传递给此函数。如果您更改它,您的代码将按预期工作。