C++ WinInet 和回调不工作

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

我在这里做错了什么?

最佳答案

来自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 之后),当您不需要访问协议(protocol)的细节时,这是使用 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 传递给代码中的此函数。如果您更改它,您的代码将按预期工作。

关于C++ WinInet 和回调不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257176/

相关文章:

c++ - 无法在 Xcode 上启动 SFML 应用程序

c++ - 热狗摊静态功能问题

c++ - move 赋值运算符 C++

c++ - 如何以及何时执行静态链接 (MinGW)?

java - 如何从 Java 使用 WinInet API?

c++ - 每个新的 COM 类都必须重新实现 IUnknown 接口(interface)吗?

c++ - IE BHO - 为页面加载调用 DISPID_FILEDOWNLOAD?

c++ - 如何使用 wininet 强制执行 tls 1.x

delphi - InternetErrorDlg 不保存密码

multithreading - 从互联网下载文件,同时能够随时中止下载