InternetOpenURL 内部 crash 的问题

近来遇上一个很诡异的 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  溪流  阅读(29)  评论(0编辑  收藏  举报