C++/CX - DataReader out of bounds exception

1

I have the following code which opens a file and it works most of the time for one time. After that I get exceptions thrown and I don't know where the problem is hiding. I tried to look for this for a couple of days already but no luck.

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();       
        });
    }
});

The error is triggered at this part of the code:

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

I get the following error:

First-chance exception at 0x751F5B68 in XmlProject.exe: Microsoft C++ exception: Platform::OutOfBoundsException ^ at memory location 0x02FCD634. HRESULT:0x8000000B The operation attempted to access data outside the valid range

WinRT information: The operation attempted to access data outside the valid range

Just like I said, the first time it just works but after that I get the error. I tried detaching the stream and buffer of the datareader and tried to flush the stream but no results.

c++
file
exception-handling
c++-cx
hresult
asked on Stack Overflow Oct 16, 2015 by Napokue • edited Oct 18, 2015 by Napokue

1 Answer

0

I've also asked this question on the Microsoft C++ forums and credits to the user "Viorel_" I managed to get it working. Viorel said the following:

Since LoadAsync does not perform the operation immediately, you should probably add a corresponding “.then”. See some code: https://social.msdn.microsoft.com/Forums/windowsapps/en-US/94fa9636-5cc7-4089-8dcf-7aa8465b8047. This sample uses “create_task” and “then”: https://code.msdn.microsoft.com/vstudio/StreamSocket-Sample-8c573931/sourcecode (file Scenario1.xaml.cpp, for example).

I have had to separate the content in the task<Streams::IRandomAccessStream^> and split it up in separate tasks.

I reconstructed my code and I have now the following:

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();
            });             
        });
    }
});
answered on Stack Overflow Oct 18, 2015 by Napokue • edited Oct 18, 2015 by Napokue

User contributions licensed under CC BY-SA 3.0