近來遇上一個很詭異的 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
溪流 閱讀(3231)
評論(7) 編輯 收藏 引用 所屬分類:
Windows