C ++ / CX - DataReader超出范围的异常

时间:2015-10-16 07:49:39

标签: c++ file exception-handling c++-cx hresult

我有以下代码打开一个文件,它大部分时间都可以工作一次。之后我抛出了异常,我不知道问题隐藏在哪里。我已经尝试了几天,但没有运气。

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

我收到以下错误:

  

XmlProject.exe中0x751F5B68的第一次机会异常:Microsoft C ++异常:Platform :: OutOfBoundsException ^在内存位置0x02FCD634。 HRESULT:0x8000000B操作尝试访问有效范围之外的数据

WinRT信息:该操作尝试访问有效范围之外的数据

就像我说的那样,第一次它正常工作,但之后我得到了错误。我尝试分离datareader的流和缓冲区,并尝试刷新流但没有结果。

1 个答案:

答案 0 :(得分:0)

我也在微软C ++论坛上问了这个问题,并对user“Viorel_”进行了归功,我设法让它运转起来。 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();
            });             
        });
    }
});