我有以下代码打开一个文件,它大部分时间都可以工作一次。之后我抛出了异常,我不知道问题隐藏在哪里。我已经尝试了几天,但没有运气。
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的流和缓冲区,并尝试刷新流但没有结果。
答案 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();
});
});
}
});