我正在使用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);
}
我在这里做错了什么?
答案 0 :(得分:2)
来自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
传递给此函数。如果你改变它,你的代码将按预期工作。