файл — C ++ / CX — исключение DataReader вне границ

У меня есть следующий код, который открывает файл, и он работает большую часть времени в течение одного раза. После этого мне выдаются исключения, и я не знаю, где скрывается проблема. Я пытался искать это уже пару дней, но безуспешно.

String^ xmlFile = "Assets\\TheXmlFile.xml";
xml = ref new XmlDocument();
StorageFolder^ InstallationFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
task<StorageFile^>(
InstallationFolder->GetFileAsync(xmlFile)).then([this](StorageFile^ file) {
if (nullptr != file) {
task<Streams::IRandomAccessStream^>(file->OpenAsync(FileAccessMode::Read)).then([this](Streams::IRandomAccessStream^ stream)
{
IInputStream^ deInputStream = stream->GetInputStreamAt(0);
DataReader^ reader = ref new DataReader(deInputStream);
reader->InputStreamOptions = InputStreamOptions::Partial;
reader->LoadAsync(stream->Size);

strXml = reader->ReadString(stream->Size);

MessageDialog^ dlg = ref new MessageDialog(strXml);
dlg->ShowAsync();
});
}
});

Ошибка вызывается в этой части кода:

strXml = reader->ReadString(stream->Size);

Я получаю следующую ошибку:

Исключение первого шанса в 0x751F5B68 в XmlProject.exe: исключение Microsoft C ++: Platform :: OutOfBoundsException ^ в области памяти 0x02FCD634. HRESULT: 0x8000000B Операция попыталась получить доступ к данным вне допустимого диапазона

Информация WinRT: операция пыталась получить доступ к данным за пределами допустимого диапазона

Как я уже говорил, в первый раз это работает, но после этого я получаю ошибку. Я попытался отсоединить поток и буфер от устройства чтения данных и попытался очистить поток, но безрезультатно.

1

Решение

Я также задавал этот вопрос на форумах Microsoft C ++ и благодарности пользователь «Viorel_» мне удалось заставить его работать. Виорел сказал следующее:

Поскольку LoadAsync не выполняет операцию сразу, вам, вероятно, следует добавить соответствующий «.then». Смотрите код: https://social.msdn.microsoft.com/Forums/windowsapps/en-US/94fa9636-5cc7-4089-8dcf-7aa8465b8047. В этом примере используются «create_task» и «then»: https://code.msdn.microsoft.com/vstudio/StreamSocket-Sample-8c573931/sourcecode (файл Scenario1.xaml.cpp, например).

Я должен был отделить содержание в task<Streams::IRandomAccessStream^> и разделить его на отдельные задачи.

Я восстановил свой код, и теперь у меня есть следующее:

String^ xmlFile = "Assets\\TheXmlFile.xml";
xml = ref new XmlDocument();
StorageFolder^ InstallationFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
task<StorageFile^>(
InstallationFolder->GetFileAsync(xmlFile)).then([this](StorageFile^ file) {
if (nullptr != file) {
task<Streams::IRandomAccessStream^>(file->OpenAsync(FileAccessMode::Read)).then([this](Streams::IRandomAccessStream^ stream)
{
IInputStream^ deInputStream = stream->GetInputStreamAt(0);
DataReader^ reader = ref new DataReader(deInputStream);
reader->InputStreamOptions = InputStreamOptions::Partial;
create_task(reader->LoadAsync(stream->Size)).then([reader, stream](unsigned int size){
strXml = reader->ReadString(stream->Size);
MessageDialog^ dlg = ref new MessageDialog(strXml);
dlg->ShowAsync();
});
});
}
});
0

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

Других решений пока нет …

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