読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

音声ファイルから動画ファイルを作成する(5) – StorageFile::OpenAsyncでまだハマっている。

今日も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で指定したファイルは開けるはずなのに。 いやー悩むなぁ。。