今日もOpenAsyncが出す例外でハマり続けている。今日は下記のコードを書いて試してみた。
create_task(Windows::Storage::KnownFolders::MusicLibrary->CreateFileAsync
(L"test.m4v", Windows::Storage::CreationCollisionOption::ReplaceExisting))
.then([this](Windows::Storage::StorageFile^ f){
sf::dout(f->DisplayName);
sf::dout(f->Path);
sf::dout(f->IsAvailable.ToString());
create_task(f->OpenAsync(Windows::Storage::FileAccessMode::Read)).then([this, f](task<Windows::Storage::Streams::IRandomAccessStream^> streamTask){
try {
auto stream = streamTask.get();
sf::dout(L"Stream Opened!!");
}
catch (Platform::Exception^ ex){
sf::dout(boost::wformat(L"%08x %s") % ex->HResult % ex->Message->Data());
}
catch (Platform::COMException^ ex){
sf::dout(boost::wformat(L"%08x %s") % ex->HResult % ex->Message->Data());
}
});
});
Windows::Storage::KnownFolders::MusicLibraryフォルダに"test.m4v"ファイルをCreateAsyncして、それをOpenAsyncするだけのコードだ。これを実行するとCreateAsyncは成功するがOpenAsyncは例の例外「0x40080201: WinRT originate error(パラメーター: 0x0000000080004001, 0x000000000000000B, 0x00000082565ED140)」が発生する。この例外が何を意味するのかがよくわからない。0x0000000080004001がHRESULTだと仮定すると「E_NOTIMPL」となるのだが。 この例外をキャッチしようと試みているがどうもうまく引っかからないのだ。
Windows Store Appはデフォルトではアクセスできるフォルダは制限されているが、アプリケーション・マニフェストで使用できるフォルダにミュージック・ライブラリを追加しているし、FileOpenPickerで指定したファイルは開けるはずなのに。 いやー悩むなぁ。。