C++ WinInet 和回调不起作用
Posted
技术标签:
【中文标题】C++ WinInet 和回调不起作用【英文标题】:C++ WinInet and Callback isn't working 【发布时间】:2015-07-06 23:05:32 【问题描述】:我正在使用WinInet
和InternetOpenUrl
来下载文件......这是有效的。但我想监控进度,所以我尝试添加一个回调函数,但由于某种原因它从未被调用...
代码:
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 和回调不起作用的主要内容,如果未能解决你的问题,请参考以下文章