比方说,我有非常简单的使用asynchronousWinInet的小代码示例:
#include "stdafx.h" #include "WinInet.h" #pragma comment(lib, "wininet.lib") DWORD LatestResult = 0; HANDLE MayContinue = 0; VOID CALLBACK CallBack( __in HINTERNET hInternet, __in DWORD_PTR dwContext, __in DWORD dwInternetStatus, __in_bcount(dwStatusInformationLength) LPVOID lpvStatusInformation, __in DWORD dwStatusInformationLength ) { if (dwInternetStatus == INTERNET_STATUS_REQUEST_COMPLETE) { LatestResult = ((LPINTERNET_ASYNC_RESULT)lpvStatusInformation)->dwResult; SetEvent (MayContinue); } } int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { MayContinue = ::CreateEvent (NULL, FALSE, FALSE, NULL); HINTERNET Session = InternetOpen (NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC); INTERNET_STATUS_CALLBACK CallbackPointer = InternetSetStatusCallback (Session, (INTERNET_STATUS_CALLBACK) CallBack); MayContinue = ::CreateEvent (NULL, FALSE, FALSE, NULL); InternetConnect (Session, _T ("ftp.secureftp-test.com"), INTERNET_INVALID_PORT_NUMBER, _T ("test"), _T ("test"), INTERNET_SERVICE_FTP, 0, 1); WaitForSingleObject (MayContinue, INFINITE); HINTERNET Internet = (HINTERNET) LatestResult; WIN32_FIND_DATA *FindData = new WIN32_FIND_DATA; FtpFindFirstFileW (Internet, _T ("*.*"), FindData, 0, 1); WaitForSingleObject (MayContinue, INFINITE); delete FindData; return 0; }
执行后我得到了什么:
Unhandled exception at 0xBAADF00D in WinInetTest.exe: 0xC0000005: Access violation executing location 0xBAADF00D.
它发生在最终的WaitForSingleObject周围,callstack相当混乱。
但如果我改变了
WIN32_FIND_DATA *FindData = new WIN32_FIND_DATA; FtpFindFirstFileW (Internet, _T ("*.*"), FindData, 0, 1);
至
WIN32_FIND_DATAA *FindData = new WIN32_FIND_DATAA; FtpFindFirstFileA (Internet, "*.*", FindData, 0, 1);
它执行和工作,因为它应该。 所以我的问题是 – 我真的没有做正确的事,或者只是在WinInet方面失败?
我正在使用Visual Studio 2012 btw在Windows 7上testing它。
我也遇到了FtpFindFirstFileW的困难。 当我从MBCS转换我的项目到Unicode FtpFindFirstFileW导致访问冲突似乎是0xbaadf00d在调用后某处的指针解引用,可能在准备异步结果时。 我通过在MBCS和Unicode版本中使用FtpFindFirstFileA,InternetFindNextFileA和WIN32_FIND_DATAA结构来解决此问题。 然后,我将输出cFileName字段转换为一个TCHAR字符串。
我建议改变编译器设置字符集从Unicode到多字节字符集。 同样的事情发生在我身上。