随笔-89  评论-944  文章-0  trackbacks-0

近来遇上一个很诡异的 bug:InternetOpenURL 内部发生 crash。虽说发生问题的时刻总是处于这个 API 内部,可也一直不敢确定不是其他原因引起的,就这么一直拖着。

前两天终于有可以随时操作的且重现几率非常高的机器了,测试了一下,发现一个规律:只要在调用 InternetOpenURL 之前调用过 SHGetFolderPath,此问题的重现几率就非常高;如果没有调用过 SHGetFolderPath,则基本不出现。

目前网上找到的一个几乎唯一的帖子是 http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/2982efc6-8403-4577-9dba-ad5cfdf01753,现象几乎一模一样。只可惜没有有价值的回复。该文章的作者指出的 VPN 等网络原因好像不是关键,在我这里是很普通的局域网,一样能出现。

测试代码如下:

#include <Windows.h>
#include <tchar.h>
#include <ShlObj.h>

#include <WinInet.h>
#pragma comment(lib, "wininet.lib")

#define URL _T("http://www.baidu.com/")

int main()
{
    TCHAR szCommonAppData[MAX_PATH];
    SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, szCommonAppData);

    HINTERNET hInternet = InternetOpen(_T("WCU"), INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);

    if (hInternet == NULL)
    {
        return 0;
    }

    HINTERNET hInternetFile = InternetOpenUrl(hInternet, URL, NULL, 0, INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD, 0);

    if (hInternetFile == NULL)
    {
        InternetCloseHandle(hInternet);
        return 0;
    }

    InternetCloseHandle(hInternetFile);
    InternetCloseHandle(hInternet);

    return 0;
}

在能够出现此问题的机器上,Ctrl + F5 直接运行,几乎每次必现;如果 F5 调试运行,则几率小一点,但是跑个七八次左右基本上能出现。目前 XP 32/64 上都有发现这个问题,Vista/Win7 上暂时没有发生此现象。(如果 InternetOpenURL 换成 InternetConnect、HttpOpenRequest、HttpSendrequest,则会 crash 在 HttpSendRequest 内。)

附件是一个测试工程,附带上了 Debug、Release 版本的 EXE、PDB 文件以及 Crash 时的 Dump 文件。请有心人帮忙看看。^_^
点击下载

可是,如果这个问题确实存在,为什么网上查到的相关内容这么少呢?奇怪~

posted on 2010-08-26 11:19 溪流 阅读(2979) 评论(7)  编辑 收藏 引用 所属分类: Windows

评论:
# re: InternetOpenURL 内部 crash 的问题 2010-08-26 16:01 | nickx
在 win2003(虚拟机) 中测试没有 crash  回复  更多评论
  
# re: InternetOpenURL 内部 crash 的问题 2010-08-26 16:03 | nickx
可以抓一个 dump 文件试试。
发到我的邮箱吧 nicoster at gmail com  回复  更多评论
  
# re: InternetOpenURL 内部 crash 的问题 2010-08-26 17:17 | 溪流
@nickx
dump 附件里有,现在忙着,等等发给你。只有少数系统会出现,只是一旦出现了,重现的机会比较多的。  回复  更多评论
  
# re: InternetOpenURL 内部 crash 的问题 2010-09-02 13:06 | cui_y_x
SHGetFolderPath在shell32.dll中定义,shell32.dll又引入了wininet.dll,wininet.dll中使用了一些全局的互斥量,可能是由于某种原因wininet内部死锁了。wininet的确被很多人所病垢,用起来有时是会有莫名其妙的问题,可以考虑使用新的winhttp来代替。  回复  更多评论
  
# re: InternetOpenURL 内部 crash 的问题 2010-09-03 01:41 | 溪流
@cui_y_x
多谢指教哈,尝试下WinHttp系列~  回复  更多评论
  
# re: InternetOpenURL 内部 crash 的问题 2012-12-27 17:17 | aa
我也出现这个问题了 搜到这里了 不知道楼主怎么解决的  回复  更多评论
  
# re: InternetOpenURL 内部 crash 的问题 2012-12-29 15:42 | 溪流
@aa
当时是换用了 WinHttp  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理