gpt4 book ai didi

C++ WinInet 和回调不工作

转载 作者:行者123 更新时间:2023-11-30 03:51:27 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com