在asynchronous模式下使用FtpFindFirstFile unicode版本访问冲突

比方说,我有非常简单的使用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它。

Solutions Collecting From Web of "在asynchronous模式下使用FtpFindFirstFile unicode版本访问冲突"

我也遇到了FtpFindFirstFileW的困难。 当我从MBCS转换我的项目到Unicode FtpFindFirstFileW导致访问冲突似乎是0xbaadf00d在调用后某处的指针解引用,可能在准备异步结果时。 我通过在MBCS和Unicode版本中使用FtpFindFirstFileA,InternetFindNextFileA和WIN32_FIND_DATAA结构来解决此问题。 然后,我将输出cFileName字段转换为一个TCHAR字符串。

我建议改变编译器设置字符集从Unicode到多字节字符集。 同样的事情发生在我身上。