FileOpenPickerを使ってWAVファイルを選択してOpenAsyncでファイルを開こうとしている。簡単なコードなのだがよくわからない例外が発生して悩んでいる。
void sfmfMain::OpenFile()
{
auto openPicker = ref new Windows::Storage::Pickers::FileOpenPicker();
openPicker->FileTypeFilter->Append(L".wav");
openPicker->FileTypeFilter->Append(L".mp4");
create_task(openPicker->PickSingleFileAsync()).then([this](Windows::Storage::StorageFile^ file)
{
if (file != nullptr){
create_task(file->OpenAsync(Windows::Storage::FileAccessMode::Read)).then([this, file](Windows::Storage::Streams::IRandomAccessStream^ stream)
{
m_audioReader = ref new sf::AudioReader(stream);
});
//Windows::Storage::StorageFile^ st = create_task(Windows::Storage::KnownFolders::VideosLibrary->CreateFileAsync(L"test.m4v", Windows::Storage::CreationCollisionOption::ReplaceExisting)).get();
//auto stream = create_task(st->OpenAsync(Windows::Storage::FileAccessMode::ReadWrite)).get();
//m_videoWriter = ref new sf::VideoWriter(stream);
}
}
);
}
上記コードのOpenAsyncのところで下記エラーが発生する。
0x8004001というエラーはE_NOTIMPLということでOpenAsyncは実装されていないということらしい。そんなはずはないのだが。今のところどうしたもんかと悶々としている状態である。しかしこんな簡単そうなところでハマるとは。。非同期プログラミングがいまいちよくわかっていないのでそのせいもあるかも。
ファイルを開くメソッドも非同期とはマイクロソフトの徹底ぶりはちょっと偏執的じゃないのかなと最初思ったけどインターネット上にあるファイルを想定するとファイルを開くのも時間がかかるのでインターネットが普通の時代ではこの設計は正しいのだなと勝手に納得している次第。