【问题标题】:C++ WinInet and Callback isn't workingC++ WinInet 和回调不起作用
【发布时间】:2015-07-06 23:05:32
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

    标签: c++ wininet


    【解决方案1】:

    来自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 传递给此函数。如果您更改它,您的代码将按预期工作。

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 2016-08-23
      • 2017-11-27
      • 2013-10-13
      • 2019-12-12
      • 2014-09-13
      • 2013-11-20
      • 2018-04-08
      相关资源
      最近更新 更多