Нарушение прав доступа при использовании версии Unicode FtpFindFirstFile в асинхронном режиме

Допустим, у меня есть очень простой маленький пример кода, который использует асинхронную WinInet:

#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?

Я тестирую его на Windows 7, используя Visual Studio 2012, кстати.

0

Решение

У меня также были проблемы с FtpFindFirstFileW. Когда я преобразовал свой проект из MBCS в Unicode, FtpFindFirstFileW привел к нарушению доступа, которое, по-видимому, было разыменованием указателя 0xbaadf00d где-то после вызова, возможно, когда готовился асинхронный результат. Я работал над этим, используя FtpFindFirstFileA, InternetFindNextFileA и структуру WIN32_FIND_DATAA в сборках MBCS и Unicode. Затем я преобразовываю выходное поле cFileName в строку TCHAR.

1

Другие решения

Я бы порекомендовал изменить настройку компилятора символов с Юникода на Многобайтовый набор символов. То же самое происходило со мной.

0

По вопросам рекламы [email protected]