次の方法で共有


C++ と CMake での winapp CLI の使用

このガイドでは、C++ アプリケーションで winapp CLI を使用してパッケージ ID でデバッグし、アプリケーションを MSIX としてパッケージ化する方法について説明します。

パッケージ ID は、Windows app モデルの主要な概念です。 これにより、アプリケーションで特定の Windows API (通知、セキュリティ、AI API など) をaccessしたり、クリーン インストール/アンインストール エクスペリエンスを使用したりできます。

標準の実行可能ファイル ( cmake --build で作成されたものなど) にはパッケージ ID がありません。 このガイドでは、デバッグ用に追加し、配布用にパッケージ化する方法を示します。

[前提条件]

  1. ビルド ツール: CMake でサポートされているコンパイラ ツールチェーンを使用します。 この例では、Visual Studioを使用します。 コミュニティ エディションは、次の方法でインストールできます。

    winget install --id Microsoft.VisualStudio.Community --source winget --override "--add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --passive --wait"
    

    インストール後に再起動します。

  2. CMake: CMake をインストールします。

    winget install Kitware.CMake --source winget
    
  3. winapp CLI: winget を使用して winapp CLI をインストールします。

    winget install Microsoft.winappcli --source winget
    

1. 新しい C++ アプリを作成する

まず、単純な C++ アプリケーションを作成します。 projectの新しいディレクトリを作成します。

mkdir cpp-app
cd cpp-app

基本的な "Hello, world!" プログラムを使用して、 main.cpp ファイルを作成します。

#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

ビルドを構成する CMakeLists.txt ファイルを作成します。

cmake_minimum_required(VERSION 3.20)
project(cpp-app)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(cpp-app main.cpp)

ビルドして実行して、すべてが動作していることを確認します。

cmake -B build
cmake --build build --config Debug
.\build\Debug\cpp-app.exe

2. ID を確認するようにコードを更新する

Windows Runtime C++ API を使用して、アプリがパッケージ ID で実行されているかどうかを確認するようにアプリを更新します。

まず、CMakeLists.txt を更新して、Windows App モデル ライブラリにリンクします。

cmake_minimum_required(VERSION 3.20)
project(cpp-app)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(cpp-app main.cpp)

# Link Windows Runtime libraries
target_link_libraries(cpp-app PRIVATE WindowsApp.lib OneCoreUap.lib)

次に、 main.cppの内容を置き換えます。

#include <iostream>
#include <windows.h>
#include <appmodel.h>

int main() {
    UINT32 length = 0;
    LONG result = GetCurrentPackageFamilyName(&length, nullptr);

    if (result == ERROR_INSUFFICIENT_BUFFER) {
        std::wstring familyName;
        familyName.resize(length);

        result = GetCurrentPackageFamilyName(&length, familyName.data());

        if (result == ERROR_SUCCESS) {
            std::wcout << L"Package Family Name: " << familyName.c_str() << std::endl;
        } else {
            std::wcout << L"Error retrieving Package Family Name" << std::endl;
        }
    } else {
        std::cout << "Not packaged" << std::endl;
    }

    return 0;
}

3. ID なしで実行する

アプリをリビルドして実行します。

cmake --build build --config Debug
.\build\Debug\cpp-app.exe

"パッケージ化されていません" と表示されます。 これにより、標準の実行可能ファイルがパッケージ ID なしで実行されていることが確認されます。

4. winapp CLI を使用してprojectを初期化する

winapp init コマンドは、アプリ マニフェスト、アセット、必要に応じて C++ 開発用の Windows App SDK ヘッダーなど、必要なものをすべて設定します。

winapp init

プロンプトが表示されたら、次を実行します。

  • パッケージ名: Enter キーを押して既定値をそのまま使用します (cpp-app)
  • Publisher名: Enter キーを押して既定値をそのまま使用するか、名前を入力します
  • バージョン: Enter キーを押して 1.0.0.0 を受け入れる
  • エントリポイント: Enterキーを押してデフォルト (cpp-app.exe) を受け入れます。
  • Setup SDK: "Stable SDK" を選択してWindows App SDKをダウンロードし、ヘッダーを生成します

このコマンドを実行すると、次のものが作成されます。

  • アプリのID用のフォルダーappxmanifest.xmlAssets
  • Windows App SDK ヘッダーとライブラリを含む .winapp フォルダー
  • SDK バージョンをピン留めするための winapp.yaml 構成ファイル

5. ID を使用したデバッグ

アプリを完全にパッケージ化せずに ID を必要とする機能をテストするには、 winapp create-debug-identityを使用します。

  1. 実行可能ファイルをビルドします

    cmake --build build --config Debug
    
  2. デバッグ ID を適用します

    winapp create-debug-identity .\build\Debug\cpp-app.exe
    
  3. 実行可能ファイルを実行します

    .\build\Debug\cpp-app.exe
    

次のような出力が表示されます。

Package Family Name: cpp-app_12345abcde

デバッグ ID の自動化 (省略可能)

ビルド後のコマンドを CMakeLists.txt に追加して、デバッグ ID を自動的に適用します。

add_custom_command(TARGET cpp-app POST_BUILD
    COMMAND $<$<CONFIG:Debug>:winapp>
            $<$<CONFIG:Debug>:create-debug-identity>
            $<$<CONFIG:Debug>:$<TARGET_FILE:cpp-app>>
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMAND_EXPAND_LISTS
    COMMENT "Applying debug identity to executable..."
)

6. Windows App SDKの使用 (省略可能)

winapp init中に SDK のセットアップを選択した場合は、.winapp/include フォルダーにある Windows App SDK のヘッダーにアクセスできます。

ヘッダーを含むように CMakeLists.txt を更新します。

# Add Windows App SDK include directory
target_include_directories(cpp-app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/.winapp/include)

Windows App ランタイム API を使用するように main.cpp を更新します。

#include <iostream>
#include <windows.h>
#include <appmodel.h>
#include <winrt/Microsoft.Windows.ApplicationModel.WindowsAppRuntime.h>

int main() {
    winrt::init_apartment();

    UINT32 length = 0;
    LONG result = GetCurrentPackageFamilyName(&length, nullptr);

    if (result == ERROR_INSUFFICIENT_BUFFER) {
        std::wstring familyName;
        familyName.resize(length);

        result = GetCurrentPackageFamilyName(&length, familyName.data());

        if (result == ERROR_SUCCESS) {
            std::wcout << L"Package Family Name: " << familyName.c_str() << std::endl;

            auto runtimeVersion = winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::RuntimeInfo::AsString();
            std::wcout << L"Windows App Runtime Version: " << runtimeVersion.c_str() << std::endl;
        }
    } else {
        std::cout << "Not packaged" << std::endl;
    }

    return 0;
}

7. 必要に応じヘッダーを復元する

.winapp フォルダーが自動的に.gitignoreに追加されます。 他のユーザーがprojectを複製するときは、次のファイルを復元する必要があります。

winapp restore
winapp cert generate --if-exists skip

8. MSIX を使用したパッケージ

配布する準備ができたら、MSIX としてパッケージ化します。

  1. リリース用のビルド:

    cmake --build build --config Release
    
  2. パッケージ ディレクトリを準備します

    mkdir dist
    copy .\build\Release\cpp-app.exe .\dist\
    
  3. 開発証明書を生成します

    winapp cert generate --if-exists skip
    
  4. パッケージと署名:

    winapp pack .\dist --cert .\devcert.pfx
    
  5. 証明書をインストールします (管理者として実行)。

    winapp cert install .\devcert.pfx
    
  6. インストールして実行します。

    Add-AppxPackage .\cpp-app.msix
    cpp-app
    

ヒント

  • 実稼働配布用の証明機関のコード署名証明書を使用して MSIX に署名します。
  • Microsoft Store は MSIX に署名します。提出前に署名する必要はありません。
  • サポートするアーキテクチャ (x64、Arm64) ごとに個別の MSIX パッケージが必要になる場合があります。