Windows11 がリリースされたので、アニメ作成ソフト9VAeきゅうべえの アプリストア版を開発しようと思い、試行錯誤した記録です。今の 9va-win はアプリストアに登録できず、ZIPで実行系を配布しています。C#で作り直せば登録できるのですが、C と C++で作られているので、C++/WinRT を試してみることにしました。C++/WinRT は、ARM版とIntel版Windowsアプリが同時開発できる新しい開発環境です。知識がない状態から、どのように開発していくのか公開します。 アプリ開発してストアへの登録作業までやってみました。2万円のWindowsパソコンに開発環境を入れる方法も紹介します。
- ドン・キホーテ2万円ノートパソコン に VisualStudio を入れる方法
- Visual Studio インストール
- WinRTに関する調査
- 試行錯誤の記録
- パッケージ化
- Direct2D、DirectWrite
- いまのところの結論
ドン・キホーテ2万円ノートパソコン に VisualStudio を入れる方法
- ドン・キホーテのノートパソコン U1 は、メモリ4GB、ストレージ64GB が2万円程度で入手できた激安ノート。キーボードをはずしてタブレットにもなります。
- ただ64GB の C ドライブに、Visual Studio をいれると、WindowsUpdateができなくなります。しかし、SDカードには、Visual Studioがいれられません
- 32GBのSDカードを、仮想ディスク(VHD)にすると、そこにインストールでき、ちゃんとプログラム開発できることがわかりました。その方法を紹介します。
- ちゃんとデバッガも動きました。なお、実際の開発はデスクトップ機でやっています。ドンキ U1 はキーボードにくせがあり初心者にはすすめにくいですが、CPUを改良した U1C が入手できるようです。また、ストレージがすくない他のWindowsノートパソコンでも同じ方法が使えると思います。
仮想ディスク(VHD)の作り方
- 32GB 以上のSDカードをセット
- Windowsボタン>設定>「ディスク管理」を検索して実行(Win10)。「ディスクの管理」が起動します。
- 下にあるSDカード(リムーバブル)のバーを右ボタンクリック。メニューから「フォーマット」。これで、SDカードを「NTFS」でフォーマットします。exFAT や FAT32だと、数GBのファイルしか保存できないので、NTFSにしなければいけません。フォーマットにより中身はすべて消去されます。★★かならずリムーバブルを確認★★
- 「操作メニュー>VHDの作成」を実行。
- 「参照ボタン」でSDカードに仮想ディスクのファイル名を設定。短い半角英数名がよいです。
- 、最大サイズを設定し、OKボタンを押します。32GBのSDだと、28GBぐらいのファイルが作れます。
- ファイルができると、SDカードの下に「ディスク2」のバーができます。ウィンドウを縦にのばしてください。ファイルの作成には時間がかかります。
- 最初は「初期化されていない」「未割り当て」なので、左側を右ボタンクリックし「ディスクの初期化」を実行。GPTパーティションでよい。左側の表示が「オンライン」にかわります。
- 右側の「未割り当て」を右ボタンクリック。「新しいシンプルボリューム」を実行。「次へ」を何回かクリックし「NTFS」フォーマットのボリュームを作成します。
- 作成が完了すると、ドライブが割り当てられ、保存ができるようになります。この中に、Visual Studio をインストールすることができます。
作成した仮想ドライブを自動的にマウントする方法
- PCを再起動すると、最初、仮想ディスクVHDは単なるファイルです。
- 仮想ディスクファイルVHDをダブルクリックすれば、マウントされ、仮想ディスクが使えるようになります。
- VHDファイルを右ボタンでクリックし「ショートカットの作成」でショートカットを作ります。これを、スタートアップフォルダにいれて、起動時に実行するようにします。
- スタートアップフォルダは、Windowsボタンと「R」を同時におし、「ファイル名を指定して実行」で「shell:startup」で開きます。この中に、VHDのショートカットを入れます。
Visual Studio インストール
- ダウンロードはこちら
- 古い Visual Studio を使っていた場合は、先に削除しましょう。ツールメニュー>「ツールと機能を取得」>Visual Studio Installer が起動します。「閉じる」>「インストール済み」タブ 「その他>アンインストール」
- Visual Studio Installer から、Visual Studio Community をインストールします。
- 「インストールの場所」タブで、上の2つの場所はCドライブ以外に変更できます。ただし、SDカードのようなリムーバブルディスクは選べません。上のように仮想ドライブを準備しておく必要があります。
- インストール場所を設定後、「ワークロード」タブで、言語やツールを選びます。C++/WinRTの開発の場合は、「C++によるデスクトップ開発」、「ユニバーサルWindowsプラットフォーム開発」を選びます。
- 不足していたモジュールは、あとから「個別のコンポーネント」タブで追加できます。
サンプルの動画編集プログラム(MediaEditing) をビルドして実行
- ここ GitHub を開く
- 「Code」ボタンの右側の▼をクリック。メニューから「Download ZIP」をクリック。Windows-universal-samples-main(.zip) がダウンロードフォルダに入手できます。
- ダウンロードフォルダを開く。Windows-universal-samples-main(.zip) を右ボタンでクリック。メニューから「すべて展開」を実行。「展開」ボタンをおすとダウンロードフォルダの中に「Windows-universal-samples-main」ができます。
- 「Windows-universal-samples-main」の中の「Samples」フォルダの中にたくさんのサンプルがはいっています。
- この中の「MediaEditing」を開きます。「cpp」の中にC++、「cs」の中にC#プログラムがはいっています。
- 「cpp」の中の「MediaEditing.sln」をダブルクリックします。
- Visual Studio が起動します。
- メニューバーの下の「Debug▼」「ARM▼」「リモートコンピュータ▼」がありますが、「ARM」の右側の▼をクリック。「x86」に変更します。「リモートコンピュータ」が「ローカルコンピュータ」に変わります。
- 「ローカルコンピュータ」をクリックすると、ビルド(プログラムから実行系を作る作業)が始まります。成功するとアプリがインストールされます。
- 初回、「開発者向け設定」画面が開きます。自作アプリをインストールするには「任意のソースからのアプリのインストール(開発者モード)」をオンにします。
- ドン・キホーテノートでも「MediaEditing」サンプルが起動しました。1) Trimming and Saving a clip をクリックすると、「1 Choose Video」「2 Trim Video」「3 Save Result」ボタンが表示されます。「1 Choose」ボタンで動画を選択。「2 Trim」で動画の前、後ろを削除。「3 Save Result」で、結果を保存できます。
- 以下、このサンプルプログラムを手掛かりに、WinRT アプリを作っていく過程を紹介しています。
Visual Studioでよく使うキー
Visual Studio メモ
- 右側がソリューションエクスプローラで、プロジェクトに含まれるファイルなどが表示
- ソリューションエクスプローラの親を右ボタンでクリックし、「スタートアッププロジェクトに設定」すると、右向き▲ボタンでこのプロジェクトが実行される。
- ソリューションエクスプローラの親を右ボタンでクリックし、一番下の「プロパティ」を開くと、コンパイラー、リンカーなどの設定がみえる
- プロパティの $(ProjectDir); はプロジェクトがあるフォルダ(.vcxproj, .sln)ほかの意味はこちら
- ビルドすると下に結果が表示される。下の「出力」タブを押すとエラーが見える
- プロパティの $(GeneratedFilesDir); は、x86, x64, ARM などのCPUフォルダ
WinRTに関する調査
- C++/WinRT を開発するには、Visual Studio 2019 が必要。 C++17 のコンパイラが必要。いったん古い VisualStudioを削除し、2019 Community を入れるとよい。
- 実行には、Windows10.0.17134.0 (Windows 10、バージョン 1803) 以上が必要らしい
- IntelとARM版Windowsの両方で動くようになるらしい。M1 Mac はすばらしかったが、ARM Windows はいらん。あ、M1 Mac で動かすのかしら。ChromebookもIntelとARM版があり、ARM のほうが応答が速い気がする。
C#のドキュメントは多いのですが、C++の資料があまりありません。C# のプログラムは、C++ プログラムに書き換えられるようです。MicrosoftのサンプルにはC#とC++の両方が用意されてます。
- 最強サンプル(C#,C++)
- C++/WinRT 画像変換、ファイル読み書き
- ファイルピッカーと画像表示
文字列処理
C# で使えるが、C++だと使えない文字列処理があるみたい。そのために、関数を定義して使うようだ。Substring関数の例
//選択したファイルの拡張子を差し替える文字列処理例
StrageFile ^pickedFile;
int len = pickedFile->Name->Length();
int ext = pickedFile->FileType->Length();String ^suggestedFileName = Substring(pickedFile->Name,0,len-ext) + ".mp4";
String^ Helpers::Substring(String^ s, std::wstring::size_type startIndex, std::wstring::size_type length)
{
std::wstring sourceString(s->Data());
std::wstring substring = sourceString.substr(startIndex, length);
return ref new String(substring.data());
}
非同期プログラム
winRT は、多くの関数が非同期実行(結果がでる前に終了する)になっており、呼び出し方がきまっています。WinRTは co_await, C++/CXは、task クラス、.then メソッドを使います。/ZW コンパイラ スイッチ UWP用 が必要みたいです。WinRTの非同期関数の型 IAsyncAction, IAsyncOperationで、WithProgressで経過を処理できるみたいです。
パッケージ
Windowsアプリにするためには、パッケージ化する必要あり
- テスト用パッケージ作成 >>プロジェクト>公開>パッケージ作成 でパッケージがつくれるようだ
- マニフェストデザイナ
- アプリのパッケージ化
ファイルアクセス
- UWPアプリには、ファイル システム全体にアクセスする権限がありません。
- StorageApplicationPermissions クラスの FutureAccessList プロパティを使うとよいらしい。リストに1000件までいれられる。
- auto picker = ref new FileOpenPicker();
動画編集
- MediaComposition
-
MediaClip を画像ファイルから作成するには、画像ファイルと再生時間を指定して CreateFromImageFileAsync
-
ファイル作成は RenderToFileAsync。 作成経過は、AsyncOperationWithProgress
- 音は BackgroundAudioTrack.CreateFromFileAsync で BackgroundAudioTrack を作成。 BackgroundAudioTracks プロパティに追加。
- 複数の音を入れるにはトラックを clone。Delayプロパティで開始時間をセット
画像の作成は、SoftwareBitmapを使います。
- SoftwareBitmap
- #include <MemoryBuffer.h> // IMemoryBufferByteAccess
- SoftwareBitmap.LockBuffer で BitmapBuffer を取得
- IMemoryBufferByteAccess.GetBuffer でデータを書き込む
- unsafe キーワード宣言が必要。 プロジェクトの [ビルド] プロパティ>、[アンセーフ コードの許可] をオン
Canvasを使ったプログラムの作り方
Win2D を使うと、古いスタイルでプログラムできるみたいだ。
XAML といっしょに使う場合は、SurfaceImageSource を使うらしい。Canvasは古い?XAML には、<Image をいれるようだ。描画を高速で行う場合は、SwapChainPannelを使うらしい。
- SurfaceImageSource
- SwapChainPannel
UWP サンプル
試行錯誤の記録
未知の状態からプログラムを開発していく過程を紹介します。かなり苦労してます・・・が、独学とネット検索ですすめます。
勉強方法
新しいプログラム言語の習得は、次のようにやっています。
- 知っている人がいれば、その人にきく。>>WinRTを知っている人はいなかった。
- いない場合、やりたいことに近いサンプルコードを見つける
- サンプルコードを少しずつ改造していく
- 今回やりたいことは、「9VAe Windows版にMP4出力をつけて、ストアプリにする」です。
- その前段階として、9va2mp4 という変換アプリを作成します。
- サンプルプログラムはすぐ見つかりましたが、中を見ると知らない言葉が・・。これを解読していきます。
元にするサンプル
見つけたサンプル「MediaEditing」はつぎのようなプログラムです。
- 動画ファイルを選択
- 動画の一部をクリップして保存
- 音楽トラックを追加
これを改造していきます。まずそのまま動作することを確認します。改造してエラーがでたら間違いとわかります。すこしずつ改造して動かしてみることが重要です。これを繰り返して正しい書き方を勉強していきます。9VAeは静止画を何枚も作成して動画にするので、まず、1枚のJPEGを動画にするように改造してみます。
動画作成方法の習得
- 動画ファイル選択から、Xamlファイルの「Click=」に関数名をかくと、ボタンを押したときにその関数が実行されるとわかりました。
- ハンドル宣言子(^)は、自動的に削除されるオブジェクトのポインタだと調べました。中身は(*)、メンバーは(->)でアクセスするとわかりました。
- C# だと「MediaClip.CreateFromImageFileAsync(IStorageFile file, TimeSpan originalDuration)」が、C++ だと「MediaClip::CreateFromImageFileAsync(file, originalDuration)」と書けることがわかりました。
- MediaCompositionを作成し、MediaClipを追加して、GeneratePreviewMediaStreamSourceで動画作成できることがわかりました。
- JPEG画像を5秒つづける動画ができました。
さらに次のように改造します。関連したコードをコピペしてプログラムを作成します。文法エラーが出るので、それをなくすように修正していくと必要な知識があつまってきます。
- 画像を自分で作成する
- 動画を保存する
- Create_task then を続けて書く方法が見つかりました
- 自分でBitmapを作成する場合は、SoftwareBitmap を使う。以前は、 WritableBitmap だった。これは、DirectXの内部メモリを直接アクセスし、高速。WinRTでは Windows::UI::Xaml::Media::Imaging::WritableBitmap が定義されたようです。
- DirectX の中をさわるために、Microsoft::WRL::ComPtr 、IBufferByteAccess を使う。
- IBufferByteAccess を使うためには、#include <robuffer.h> が必要。
- IMemoryBufferByteAccess を使うには、#include <MemoryBuffer.h>が必要
- AsComPtr 、ThrowIfFailed は自分で定義するようです。
- SoftwareBitmapの作り方がわかりました。
次は動画を作成してみます。
- 画像が変化する動画を作成する。
- 1クリックで1コマめを作成し、2クリックで違う絵になる動画を作成する。
- 動画にするには、いったんファイルにするほうがよいことがわかりました。
- その場合、数1000枚の画像ができるため、終了後にこれを削除しなければいけません。
- 作成した画像は、std::vector<Windows::Storage::StorageFile^>files; に記録すればよい。初期化は、files.resize(0); ファイル追加は、files.push_back(file); 全部削除は、for each( auto f in files) f->DeleteAsync(); vector の使い方はこちら。#include <vector> が必要
- 削除も非同期処理になりますが、上のリストにいれておけばエラーを出さずに削除できることがわかりました。
タイマーイベントで動画作成するように変更します。
- クリックしなくても、自動的に何コマも作成できるようにする
- タイマーイベントは、Windows::System::Threading::ThreadPoolTimer::CreatePeriodicTimer を使う。void timerThread(Windows::System::Threading::ThreadPoolTimer^ timer); 関数を定義する。
- ただ、タイマーイベントにすると非同期処理がうまく動作せず、ボタンクリックで次の処理に進む方法にしました。
音の追加方法の習得
動画ができるめどがついたので、つぎに音楽をつけます。
- 動画に音をつける
- 指定した音の一部の時間を、動画の指定した時間からはめこむようにする
- 指定した音楽ファイルがなかった場合、ファイルエラーが発生しますが、これを、try catch では処理できないようです。ファイルセキュリティのせいかもしれません。そのため、なかった場合はファイルを作成し、開いたファイルが直前につくられたものならファイルがなかったものにするという処理にしました。
- 音の開始時間は、BackgroundAudioTrack ->Delay (TimeSpan) で設定。
- 音の再生時間は、後ろからトリミングする。BackgroundAudioTrack ->TrimTimeFromEnd
- 複数の音を動画に追加することができました。
ユーザーインタフェースの習得
音楽のめどがついたので、動画パラメータ(サイズ、コマ数、再生時間)ファイル名、の入力部分を作成します。
- 9va2mp4 の起動画面をつくる
- アプリのスタートは、App::OnLaunched からスタートすることがわかりました。最初のページは、MainPageでした。これを、TrimAndSaveClip に変更し、画面を単純化しました。
- xml にサイズ、コマ数、再生時間を追加する方法を調査。
- <VisualStateManager.VisualStateGroups>でレイアウトを状態によって変更するようです。
- <StackPanel でボタンを一列に並べる。 Orientation="Horizontal"で横。<Grid 表組、Grid.Row=行
- <TextBlock 注釈などの表示
- <TextBox 文字入力。 x:Name="PicWidth" Margin="5" 、VerticalAlignment="Center"、TextChanged=" で入力が変化するごとに文字処理する。数値は、 FromStringTo<int>(PicWidth->Text); で取得できる。エラー処理のサンプルコード、TextChangedHandlerDouble 、自分で用意。PicWidth->Text = number.ToString();
- <Button ボタン。x:Name="save" この「save」がオブジェクトポインタになる。save->IsEnabled = false; でボタン無効。Click="Save_Click"。 Save_Click が実行関数
既存ルーチンの組み込み
これで、コンバーターのUI部分はできました。9VAeのソースコードを組み込みます。
- C のソースを追加すると「/ZW オプションがあるとコンパイルできない」エラーが出た。/ZW オプションは、プロジェクトには必要。Cソースには、/ZW オプションをいいえにできるようだ。
- 「プリコンパイルヘッダー検索中に不明なEOFが見つかりました。pch.h をソースに追加しましたか?」エラーが出た。Cソースには、プリコンパイルヘッダを使わないよう個別設定。
- 「error C3861: '__readfsdword': 識別子が見つかりませんでした。」エラーが出た。これは、プロジェクト>プロパティ>C/C++>コード生成>構造体メンバーアラインメントを8バイト(/Zp8)にすると出なくなった。
- インクルードファイル(*.h)もすべてプロジェクトにいれておかないと正しく処理できない。
- 9VAeソースは C++ライブラリにして、スタティックリンクするとよいかも。これだとライブラリのビルド設定は、メインと異なる設定で作れる。fopen を使う方法
- スタティックライブラリの作成ができた。しかし、メインとリンクできず。「 LNK2001: 外部シンボル __imp__SelectObject@8 は未解決」など・・これらは以下のライブラリをプロジェクトに追加すると解決された。
- gdi32.lib 。描画関数
- kernel32.lib 。ファイル関係
- shell32.lib 。ShellExecute
- comdlg32.lib。コモンダイアログ
- YesNoダイアログなど、winRT側で表示したほうがよい関数は、メインプロジェクトに cpp 関数をつくっていれて、リンクエラーがなくなった!
- プロジェクトツリーの親を右ボタンクリックし「ビルドの依存関係」でライブラリを追加すれば、いっしょにビルドすることができ、ライブラリもデバッガーで動く。すばらしい。
ファイルアクセス権限の調査
リンクエラーがなくなったので、メインとの接続部分を作っていきます。
winRT で 9VA ファイルを選択してライブラリにわたし、縦、横サイズが取得できるまでを作ります。
- 「ストアアプリから fopenを呼ぶ」を参考にする。StrageFile ^file; から file->Path でフルパス Stringが取得できる。
- パスは取得できたが、アクセスエラー。アクセス許可についてはこちら
- パッケージマニフェストでアクセス宣言する方法 Package.appxmanifest ファイルで設定するらしいが、うまくいかない。
- テンポラリファイルに複製すれば、fopoenでアクセスできるらしい。
- すべてテンポラリにコピーすればアクセスできそう。幅、高さの取得に成功。テンポラリファイルにコピーしてC文字のパスを取得するまで(ただし日本語名に未対応、これは後からやる。9VAeの中はShiftJIS・UTF8、WinRTはUTF16)
auto picker = ref new FileOpenPicker();
create_task(picker->PickSingleFileAsync()).then([this](StorageFile^ videoFile)
{
auto tempFolder = ApplicationData::Current->TemporaryFolder;
create_task(videoFile->CopyAsync(tempFolder, videoFile->Name, NameCollisionOption::ReplaceExisting)).then([this](StorageFile^ tempFile)
{
String^ path = tempFile->Path;
std::wstring wp(path->Data());
std::string sp(wp.begin(), wp.end());
char* cpath = (char*)sp.c_str(); //これで fopenできた
}
}
選択した9VA ファイルから1コマの動画を作成し、プレビューに表示するまで作ります
- ファイルにアクセスできたが、描画するための HDC(描画先) や HWND(ウィンドウ) をどう取得すればよいか問題に。Windows.UI.Component というのをつかうとよいらしいが、ややこしそう。
- HDCは、GetDC(NULL) で、ディスプレイのHDCが得られるようだ。これで9VAeがディスプレイに直接描画した!最後は描画しないようにしないといけないがどこまで動いたかわかるのでこのままにしておく。
アプリの完成
ライブラリと接続し、デバッガーで動作するようになったので、あとは、次のような点を調整
- 入力数値のエラー処理
- 中断処理
- 8の倍数でない出力ができるか
- 外部ファイル(画像、音楽)の読み出し(テンポラリーへの複製ができるか)
- MIDI音楽の再生 >> 難しそうなのであきらめ
- 漢字ファイル名への対応 >> この変換プログラムを使用
- 多国語対応
ファイルピッカーでユーザーが指定したファイルしか読みだせないので、最初にアニメーションで使っているファイルをすべて選択してもらうことにする。これをテンポラリに転送し、その中で読み出しを行う。
- 複数ファイルを選択し、全部テンポラリにコピーするコード
auto picker = ref new FileOpenPicker();
create_task(picker->PickMultipleFilesAsync()).then([this](IVectorView<StorageFile^>^ files)
{
auto tempFolder = ApplicationData::Current->TemporaryFolder;
for (auto file : files) {//複製
flle->CopyAsync(tempFolder, file->Name, NameCollisionOption::ReplaceExisting);
}
});
- auto は自動型設定(右にあわせる)、ref new で割り当てると自動的に解放される
- create_task then は非同期処理。[this] は非同期処理に this をわたす。^で定義したオブジェクトは外側の定義が引き継がれるので[ ] には入れない。
- IVectorView<StorageFile^>^ files は、torageFile^の配列で、複数選択結果
- for (auto file : files) 、autoで fileの型が自動設定される。
- NameCollisionOption::ReplaceExisting は同名があったとき上書き
- 動画を作成するために全フレームのBMP画像をテンポラリフォルダに作成しているが、MP4を作成したあと、メディア表示にも使われるみたい。削除するとメディア表示ができなくなった。
9VAeファイルからMP4動画に変換するアプリ「9va2mp4」に仕上げます。
多国語対応
- Stringsフォルダを自分で作成して、en-US, ja-JP フォルダを入れる。英語の説明
- 新規追加>XAML>リソースファイル(.resw)を入れ「Resources.resw」にリネーム。しかしこの方法では、Stringフォルダも en-US フォルダもできなかった。
- いったん除外し、エクスプローラで、String/en-US, String/ja-JP フォルダを作成し、Resources.resw をそこに入れてからプロジェクトに追加。
- Xamlやプログラム中の文字列の入れ替えは説明をみてもよくわからず、サンプルから以下のコードを抽出。アプリの先頭に以下のコードをいれた。
//定義
private:
Windows::ApplicationModel::Resources::Core::ResourceMap^ strMap;
Windows::ApplicationModel::Resources::Core::ResourceContext^ strContext;
//プログラムの先頭にいれる "Resources" は、"Resources.resw"に対応
strMap = Windows::ApplicationModel::Resources::Core::ResourceManager::Current->MainResourceMap->GetSubtree(L"Resources");
strContext = Windows::ApplicationModel::Resources::Core::ResourceContext::GetForCurrentView();button1->Content = strMap->GetValue("button1", strContext)->ValueAsString;
textBlock1->Text = strMap->GetValue("textBlock1", strContext)->ValueAsString;
- button1はボタン(xaml のx:name)、ja-JP フォルダの"Resources.resw" に 名前"button1" 値 "日本語のボタン"、 en-US フォルダの"Resources.resw" に 名前"button1" 値 "English button name"、といった感じで書いておく。 textBlock1 はテキスト
上の日本語の表示は ja-JPフォルダ。英語は en-USにはいっており言語によって切り替えできるようになった。
パッケージ化
- MSIX形式のパッケージをつくる
- package.appxmanifest をダブルクリックし、アイコンやロゴを作成する。1つの PDFかAI画像を「すべてのビジュアル資産」にセットして「生成」をおすとバッチロゴ以外全部作ってくれた(VisualStudio19)。バッチロゴは通知で使われる特別なアイコン。
- パッケージ化する方法はこちら
- プロジェクトを右ボタンクリック>「公開」>「アプリパッケージの発行」
- 「サイドローディング」「自動更新」のチェックははずしておく。「次へ」
- 「署名の追加」ここで「作成」をおすとテスト用署名がつくれる。これがPCに登録され、PCにインストールできる。
- バージョン、アーキテクチャ選択
- 「自動更新」のチェックがあると、自動更新を配信するサイトが必要
- Windows10SDK これは、Visual Studio をいれると導入される。「ツールメニュー>ツールと機能の取得>個別のコンポーネント」で確認できる
- Windows設定で「開発者モード」をオンにする
- VisualStudio でパッケージ作成すれば、Windowsアプリ認定キットで実行できる
パッケージの動作テスト
- パッケージの中の「Add-AppDevPackage.ps1」を右ボタンクリック。Powershellで実行。これで管理者権限の取得やアプリの登録が実行される
- デバッガーで実行した後だと、同じアプリがすでに登録されているエラーになる。Windows設定からアプリを削除する必要あり(新しくインストールしたものから検索)
アプリストアに登録してみます。まず、開発者登録。
開発者登録
- 開発者登録はこちら。料金は個人19ドル。1回限りでよい(Appleは毎年とられる)
- 国名:Japan
- Publisher名、住所、電話番号、を入力。Microsoft Acountをいれたが支払いのページで1回失敗したが、アカウントに戻り再入力すると、支払いページに別の支払い方法リンクにはいり登録できた。多くの人は開発者登録のクーポンで登録するのだろう。
- 登録すると Microsoft Partner Centerが開く。アプリ作成方法がかいてある。
アプリの登録
- アプリの名前:9vae2mp4 といれると、アプリのページが新しくできた。
- Application overview:Pricing and availability
- 価格を無料に設定して保存すると、次の項目になった。
- Submission 1:Properties > Photo+Video
- プライバシーポリシー情報を入力
- Display mode:Mix Reality表示するか >いいえ
- Product declarations:宣言
- System requirements:必要なハードウェア。特に設定せず
- Age ratings:年齢に関連した情報をいれる
- Packages:作成したパッケージを登録する。下のようにしてパッケージ作成。x86_bundle.msixupload をドラッグして登録。Windows10 Desktop だけにチェックした。古いDLL使用で認定テスト不合格だが動くので登録してみる。
- Store listings:アプリの説明を言語ごとに作成
- Default description:アプリの説明、Screenshots:スクリーンショット、
- Store logos、Trailers and additional assets、Supplemental fields は省略
- Additional information にURLを追加、Copyright (c) 9VAe Lab、Developed by Danjiro Daiwa とした
- ここまで入力して審査に提出>>やはり、下の認定テストに通らないとアップできない。
Microsoft Store と関連づけてからパッケージ作成、認定テスト実施
- VisualStudio >プロジェクト右ボタン>公開>アプリを Microsoft Store と関連づけを実行
- PartnerCenterに登録した名前 9vae2mp4 がリストに表示されたのでそれと関連付けできた。
- 公開者ID:関連付けを行うと自動作成された
- プロジェクト右ボタン>公開>パッケージ作成
- PartnerCenterに登録した公開者、名前で作成 。アーキテクチャ x86 のみとした。
- Windowsアプリ認定キットを使用にチェックを入れて作成実行
- 作成完了後「Windowsアプリ認定キットを起動」をクリック
- HDCを使った描画関数などが使用不可で不合格という判定が出た。テスト実行はできたが、アプリ登録は不可。gdi32.dll, kernel32.dll, user32.dll, winmm.dll
認定テストが合格になり、ストアの掲載情報を入力すれば、Microsoftに審査提出できるみたい。描画部分を全部、Direct2Dに置き換えないといけない。これは時間がかかりそう。Windowsストアアプリが増えなかった一因かも。
感想:Mac の M1 対応の場合、古い描画関数(Objective-C)がそのまま使えた(一部修正はあったが)。Windowsの場合、GDI関数の抽象化が不十分なため、ARMでも動かすために描画関数を使えなくするようだ。ハードアクセラレータの組み込みを簡単にするためCPU描画をなくしたいのかも。MacOSは、スティーブ・ジョブズが Mac を追い出されてつくった Next社の Next Step がベースで、Objective-C で作られていた。NextStep は、PowerPCでも Intel でも動いたので、Mac もIntel から、 Arm の M1 CPUに変更できた。Windowsも同じことをやりたいが、ハードアクセラレータの部分もいっしょに抽象化したいのだろう。 テスト実行(サイドローディング)だと昔のCPU描画でも動くのは、移行支援のためか。方針は納得できるが、過去のCPU描画アプリをストアアプリに修正するのは、Mac よりも相当難しいみたいだ。自分で確保したバッファメモリ中に文字を描画できない点がネック。(Android版 9VAe のDXライブラリもそうなっている)
Direct2D、DirectWrite
HDCがつかえるライブラリみたいだが、たぶん難しかったのだろう。開発がとまっているらしい。なんとか完成させてほしい。
- Direct2Dはこちら
- Direct2Dをつかった描画
- Direct2Dファクトリを作成し、RenderTarget を作成する
- DX:ThrowIfFailed はどこで定義されているか>>pch.h に定義をいれる
最終目標:下がWindowsストアアプリでできるようにする
いまのところの結論
- CPU描画の過去のプログラムを、Windowsストアアプリに変更するのは、内部の作り方によっては、相当むずかしいことがわかった。9VAeの移植はいったんあきらめ。
- 過去のWindows有名アプリも同じような状況と予想。AviUtlなど多くのソフトが、ストアアプリにならないのではないか。Objective-C が使えるAppleと異なる。ストアアプリがふえないので、Android アプリを動かす作戦に出たのでは。
- ハードアクセラレータが必須の3次元アプリは、作り直さないといけないので、ストアアプリにできる。
- もともと、9VAeに動画出力をつけるのが目的だった。「ffmpeg」をつかったらできた。
- あきらめていたら、Amazon版9VAeがWindowsストアアプリに勝手になった。Windows Subsystem for Android を使う。