如何结束异步WinInet的回调函数?

饿半肚 2012-02-07 06:10:58
之前的一个帖子——
“Win7里TerminateThread会造成崩溃?”
http://topic.csdn.net/u/20120116/17/2fb1c63e-8f37-4bf3-8fd7-b32343ceaf36.html

已经定位出原因了,就是因为发送http请求的线程被结束了以后,通过InternetSetStatusCallback设置的回调函数还会继续被调用,结果就引用到一些已经被销毁了的变量,引起崩溃。

我尝试在结束线程前先调用InternetSetStatusCallback(hInternet, NULL);取消其回调函数。但是无效。。求解,或求方案,谢谢。。(另外,我也试了在结束线程前首先把各种句柄InternetCloseHandle()掉,但也是没作用。。)
...全文
129 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
饿半肚 2012-02-08
  • 打赏
  • 举报
回复
果然哦!谢谢!
ArcRain 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kniferlv0 的回复:]

请问是哪个版本的SDK?HINTERNET为什么有继承派生之说?搞不懂啊,麻烦再点拨一下喽~~
[/Quote]

不是继承派生,而是相当于一次操作的上下文关联HINTERNET。
后续的HINTERNET是建立在之前的HINTERNET上,所以如果对之前的HINTERNET设置了一次Callback,那么后续建立在这个HINTERNET上的HINTERNET也会有Callback。
参考这个链接里的图:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383766%28v=vs.85%29.aspx
例如你在InternetOpen返回的HINTERNET上设置了一次Callback,那么在InternetConnect调用之后返回的HINTERNET上,这个Callback也是有效的,这样你在关闭HINTERNET时,就需要分别都把这两个HINTERNET的Callback置空。
饿半肚 2012-02-07
  • 打赏
  • 举报
回复
请问是哪个版本的SDK?HINTERNET为什么有继承派生之说?搞不懂啊,麻烦再点拨一下喽~~
ArcRain 2012-02-07
  • 打赏
  • 举报
回复
你可以参考SDK的例子Samples\web\Wininet\Async,注意看它的结束操作。
另外MSDN上也提到了,A callback function can be set on any handle, and is inherited by derived handles.
参考链接:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385120(v=vs.85).aspx
因此在结束操作时,你要尝试把派生的各HINTERNET上的回调都置空。

18,357

社区成员

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

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