200分求解WinInet异常操作出现异常的问题

Areslee 2008-11-11 10:38:59
我用WinInet写异步访问网络的代码,发现如果在接收数据时出现pending,WinInet很容易出现异常。出现异常的代码是在Kernel32里,看上去象是WinInet在调用Kernel32的函数减少一个信号量或interlock之类的时候传送了错误的参数
出错的代码如下 :
77E7C23D mov ecx,dword ptr [esp+4]
77E7C241 mov eax,0FFFFFFFFh
77E7C246 lock xadd dword ptr [ecx],eax <<<<<<<<<<<<<<<<<<<<异常,因为ECX的值=14H
77E7C24A dec eax
77E7C24B ret 4

我的机器是Windows 2000SP4+IE6

请问一下这是什么原因,怎么解决?谢谢
...全文
173 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinEggDrop 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 Areslee 的帖子:]
我用WinInet写异步访问网络的代码,发现如果在接收数据时出现pending,WinInet很容易出现异常。出现异常的代码是在Kernel32里,看上去象是WinInet在调用Kernel32的函数减少一个信号量或interlock之类的时候传送了错误的参数
出错的代码如下 :
77E7C23D mov ecx,dword ptr [esp+4]
77E7C241 mov eax,0FFFFFFFFh
77E7C246 lock xadd dword ptr [ecx],eax < < < < < < < < < < < < < < < < <…
[/Quote]

自己直接用一般的socket模拟wininet一些API就是,反正也不难.
blackcat242 2008-11-14
  • 打赏
  • 举报
回复
不懂,顶一个
whoo 2008-11-14
  • 打赏
  • 举报
回复
依稀印象官网有example下载。
[Quote=引用 18 楼 Areslee 的回复:]
老兄能不能给个neon教程的连接?
[/Quote]
Areslee 2008-11-13
  • 打赏
  • 举报
回复
老兄能不能给个neon教程的连接?
Areslee 2008-11-13
  • 打赏
  • 举报
回复
先研究小的吧,封个DLL出来,就容易了
janreyho 2008-11-13
  • 打赏
  • 举报
回复
支持一下
Areslee 2008-11-13
  • 打赏
  • 举报
回复
谢了兄弟,且去研究先
ahao 2008-11-13
  • 打赏
  • 举报
回复
线程同步问题可能性很大
whoo 2008-11-12
  • 打赏
  • 举报
回复
嗯,libwww是个大而全的库。你不会用到全部的,所以通常需要叫深入点的研究和裁减。入手难度肯定是有的,这点要有心理准备。
至于编译问题,应该只是些第三方依赖库和配置选项的问题吧。linux环境下可以自动配置,windows下没这项功能(除非cygwin等模拟),提供了现成的vs6工程,但是其默认设置并不一定匹配你的开发环境。如正则表达式库,xml解析库,zip压缩库等。需要注意配置下。

neon相对libwww来说,范围较小,不象libwww那样保罗万象。但是因为其小巧,反而用的比较多,代码更新也很及时。neon没有提供vs6工程,只有makefile,可以用vs6的nmake编译。
Areslee 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 whoo 的回复:]
呃,简单点吧,直接追溯到你的代码的部分。 系统dll部分,通常不会有问题,有问题你也拿他没办法。有时间研究的话可以深入看看,没时间的话还是找找自己的代码的问题算了。


ps:
如果你的工程稍微专业些,建议考虑换掉wininet。用些开源的如w3c官方库libwww, 开源界普遍选择neon。 wininet只适合简单的玩玩。另外,wininet也不适合用于服务环境,这是MSDN说的。
[/Quote]
呃,Libwww下载下来好象编译不了?老兄能否指点一二?
e_sharp 2008-11-11
  • 打赏
  • 举报
回复
UP
cnzdgs 2008-11-11
  • 打赏
  • 举报
回复
根据调用堆栈,逐层向外,找出这个指针的来源。
whoo 2008-11-11
  • 打赏
  • 举报
回复
继续往上追溯,根据 esp+4 很容易 找到上一级函数传入的参数。
scq2099yt 2008-11-11
  • 打赏
  • 举报
回复
Kernel32不会有问题,主要看自己代码中调用出错的问题
whoo 2008-11-11
  • 打赏
  • 举报
回复
winient同步方式,有个超时的bug(Q176420),会造成程序死掉。
这个问题始终没有修复(到现在为止)。

[Quote=引用 5 楼 jameshooo 的回复:]
建议从微软网站下载符号文件,查看调用栈时至少不会再出现DllGetClassObject + 37h之类的地址了,它可以显示出实际的函数名称。

其次,使用异步方式可能要注意的问题太多,容易出错。其实使用WININET同步方式的话也是很容易控制的,只需传递一个回调接口,当下载状态发生任何变化时,都会调用回调接口,而且可以在任何一次回调中取消整个下载操作,跟异步方式效果一样,但是控制简便。
[/Quote]
whoo 2008-11-11
  • 打赏
  • 举报
回复
呃,简单点吧,直接追溯到你的代码的部分。 系统dll部分,通常不会有问题,有问题你也拿他没办法。有时间研究的话可以深入看看,没时间的话还是找找自己的代码的问题算了。


ps:
如果你的工程稍微专业些,建议考虑换掉wininet。用些开源的如w3c官方库libwww, 开源界普遍选择neon。 wininet只适合简单的玩玩。另外,wininet也不适合用于服务环境,这是MSDN说的。
sking2008 2008-11-11
  • 打赏
  • 举报
回复
帮顶~~~~
zhoujianhei 2008-11-11
  • 打赏
  • 举报
回复
VS完全就可以胜任啊,WinDbg也可以,需要下载相应的符号文件。
Wenxy1 2008-11-11
  • 打赏
  • 举报
回复
安装SDK的Install Debugging Tools for Windows.
看看这样调试是否方便些。
jameshooo 2008-11-11
  • 打赏
  • 举报
回复
建议从微软网站下载符号文件,查看调用栈时至少不会再出现DllGetClassObject + 37h之类的地址了,它可以显示出实际的函数名称。

其次,使用异步方式可能要注意的问题太多,容易出错。其实使用WININET同步方式的话也是很容易控制的,只需传递一个回调接口,当下载状态发生任何变化时,都会调用回调接口,而且可以在任何一次回调中取消整个下载操作,跟异步方式效果一样,但是控制简便。
加载更多回复(1)

18,356

社区成员

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

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