近来遇上一个很诡异的 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
溪流 阅读(3215)
评论(7) 编辑 收藏 引用 所属分类:
Windows