WinInet异步InternetSetStatusCallback的回调函数问题

tianya5506 2011-01-26 05:54:45
微软的代码,回调函数里面访问的hConnect、hRequest等都是全局变量。
而我想实现多文件同时下载或上传,希望回调函数访问类的成员(也就是每一个对象的)。
可是类成员函数不能做回调函数。
加上static又不能访问非静态成员变量。
纠结了,求指导,可能设计有问题。


void __stdcall Callback(HINTERNET hInternet,
DWORD dwContext,
DWORD dwInternetStatus,
LPVOID lpStatusInfo,
DWORD dwStatusInfoLen)
{
cout << "Callback dwInternetStatus: " << dwInternetStatus << " Context: " << dwContext << endl;
cout.flush();

switch(dwContext)
{
case 1: // Connection handle
if (dwInternetStatus == INTERNET_STATUS_HANDLE_CREATED)
{
INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
hConnect = (HINTERNET)pRes->dwResult;//hConnect全局
cout << "Connect handle created" << endl;
cout.flush();
SetEvent(hConnectedEvent);
}
break;
case 2: // Request handle
switch(dwInternetStatus)
{
case INTERNET_STATUS_HANDLE_CREATED:
{
INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
hRequest = (HINTERNET)pRes->dwResult;//hRequest全局
cout << "Request handle created" << endl;
cout.flush();
}
break;
case INTERNET_STATUS_REQUEST_SENT:
{
DWORD *lpBytesSent = (DWORD*)lpStatusInfo;
cout << "Bytes Sent: " << *lpBytesSent << endl;
dwNumBytesComplete += *lpBytesSent;
}
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
{
INTERNET_ASYNC_RESULT *pAsyncRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
cout << "Function call finished" << endl;
cout << "dwResult: " << pAsyncRes->dwResult << endl;
cout << "dwError: " << pAsyncRes->dwError << endl;
cout.flush();
SetEvent(hRequestCompleteEvent);
}
break;
case INTERNET_STATUS_RECEIVING_RESPONSE:
cout << "Receiving Response" << endl;
cout.flush();
break;
case INTERNET_STATUS_RESPONSE_RECEIVED:
{
DWORD *dwBytesReceived = (DWORD*)lpStatusInfo;
cout << "Received " << *dwBytesReceived << endl;
cout.flush();
}

}

}

}
...全文
1064 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stevenkoh 2013-08-12
  • 打赏
  • 举报
回复
就可以了啊

Class  A {

  static void callbackStaticEntryPoint(void * pthis);
  void realEntryPoint();
}

void A::callbackStaticEntryPoint(void * pThis)  {
	A *p = (A *)pThis;  
	p->realEntryPoint();   

	return 0; 
}
nu2987 2012-04-26
  • 打赏
  • 举报
回复
答案。。。。?
Eleven 2011-01-27
  • 打赏
  • 举报
回复
Eleven 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tianya5506 的回复:]
感谢myy,问题解决了。
InternetConnect,HttpOpenRequest最后一个参数可以传递dwContext。

另外再问个问题,我看有的资料上列出可以异步操作的api,其中没有 InternetWriteFile 。
是不是即使设置了INTERNET_FLAG_ASYNC InternetWriteFile依然是同步的?
[/Quote]
http://msdn.microsoft.com/en-us/library/aa385105(VS.85).aspx
tianya5506 2011-01-27
  • 打赏
  • 举报
回复
感谢myy,问题解决了。
InternetConnect,HttpOpenRequest最后一个参数可以传递dwContext。

另外再问个问题,我看有的资料上列出可以异步操作的api,其中没有 InternetWriteFile 。
是不是即使设置了INTERNET_FLAG_ASYNC InternetWriteFile依然是同步的?
tianya5506 2011-01-26
  • 打赏
  • 举报
回复
callback是不停调用的,全局数组怎么确定是哪一个?
dwContext传指针,好像可以,但是callback里用他来区别句柄类型。
也许用dwInternetStatus就够了,明天试下。

先谢过二位了。
myy 2011-01-26
  • 打赏
  • 举报
回复
用 dwContext 传递指针
oyljerry 2011-01-26
  • 打赏
  • 举报
回复
用全局变量数组
tianya5506 2011-01-26
  • 打赏
  • 举报
回复
全局变量就只能同时上传一个文件了。
healer_kx 2011-01-26
  • 打赏
  • 举报
回复
这个就是C++本身的应用问题了。。。
简单处理就是全局变量了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧