C++ WinInet 和回调不起作用

Posted

技术标签:

【中文标题】C++ WinInet 和回调不起作用【英文标题】:C++ WinInet and Callback isn't working 【发布时间】: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);

我在这里做错了什么?

【问题讨论】:

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

【讨论】:

以上是关于C++ WinInet 和回调不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C++ 下载文件 WinInet - 0kb 写入文件

带有回调示例的线程不起作用。

FBSDKSharingDelegate 回调不起作用,即使发布工作正常

React-Native回调函数/方法不起作用

Swift 回调不起作用

组件内导航防护回调不起作用:Nuxt JS 和`beforeRouteEnter`