> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# クイックスタート Win32

> PlayFab Services C SDK を Visual Studio 2022 プロジェクトに追加し、ネイティブ Win32 デスクトップアプリケーションから最初の PlayFab API 呼び出しを行います。

# クイックスタート: Win32

Win32 用の PlayFab Services SDK を使い始めましょう。以下の手順に従って、プロジェクトにライブラリを組み込み、PlayFab の基本機能のサンプルコードを試してください。

このクイックスタートでは、Win32 SDK を使用して最初の PlayFab API 呼び出しを行います。続行する前に、[クイックスタート: Game Manager](/services/playfab/live-service-management/gamemanager/quickstart) の手順を完了し、PlayFab アカウントを所有し、PlayFab Game Manager に慣れていることを確認してください。

## 要件

* [PlayFab 開発者アカウント](https://developer.playfab.com)。
* [Visual Studio 2022](https://visualstudio.microsoft.com/) がインストールされていること。

## プロジェクトのセットアップ

[PlayFab SDK リリースページ](https://github.com/PlayFab/PlayFabCSdk/releases/latest) から PlayFab SDK をプロジェクトにダウンロードします。

PlayFabServicesSDK.Win32.props をプロジェクトにインポートします。プロジェクトファイルで手動で行うか、Visual Studio でプロパティマネージャーウィンドウを開き、プロジェクトを右クリックして **既存のプロパティ シートの追加** を選択することで行えます。

### トラブルシューティング

プロジェクトで SDK のリンクに問題がある場合、Visual Studio インストーラーを介して 17.5 ビルドツールとライブラリのインストールが必要になる場合があります。VS2022 の **変更** をクリックし、以下の 2 つのコンポーネントをインストールしてください。

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/c/win32_1.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=dc25ef683659f85a70a09b93b2ec6c94" alt="17.5 ビルドツールをインストール" width="635" height="279" data-path="images/playfab/sdks/c/win32_1.png" />

## 初期化とログイン

### ヘッダー

同梱されているすべての PlayFab 機能にアクセスするには、**PFServices.h** をインクルードします:

```cpp theme={null}
#include <playfab/services/PFServices.h>
```

### 初期化

PlayFab の初期化には、**PFServicesInitialize** と **PFServiceConfigCreateHandle** の 2 つの関数呼び出しが必要です。この初期化の結果として **PFServiceConfigHandle** が得られます。このハンドルを後続のログイン呼び出しに提供することで、PlayFab バックエンドの正しいタイトルに呼び出しが向けられます。

```cpp theme={null}
    HRESULT hr = PFServicesInitialize(nullptr); // Add your own error handling when FAILED(hr) == true

    PFServiceConfigHandle serviceConfigHandle{ nullptr };

    hr = PFServiceConfigCreateHandle(
            "https://ABCDEF.playfabapi.com",    // PlayFab API endpoint - obtained in the Game Manager
            "ABCDEF",                           // PlayFab Title id - obtained in the Game Manager
            &serviceConfigHandle);
```

### ログイン

**PFServiceConfigHandle** を取得したら、それを使ってプレイヤーのログイン呼び出しを行うことができます。SDK では、**PFAuthenticationLoginWithSteamAsync** のような **PFAuthenticationReLoginWith\*Async** メソッドを使用します。この関数を使用すると、**SteamTicket** を使ってプレイヤーを PlayFab にログインさせることができます。

ログイン呼び出しを行った後、**XAsyncGetStatus** で呼び出しのステータスを確認できます。ステータスは最初 **E\_PENDING** で、呼び出しが正常に完了すると **S\_OK** に変わります。何らかの理由で呼び出しが失敗した場合、ステータスにその失敗が反映されます。すべての PlayFab Services 呼び出しにおけるエラー処理はこのように動作します。

**S\_OK** の結果に加えて、**PFEntityHandle** が返されます。このハンドルを使用して、ログイン済みプレイヤーとして後続の PlayFab 呼び出しを行います。このハンドルには、そのプレイヤーとして PlayFab サービスで認証するために必要なマテリアルが含まれています。

```cpp theme={null}
    PFAuthenticationLoginWithSteamRequest request{};
    request.createAccount = true;
    request.steamTicket = steamTicket; // A ticket obtained from Steam

    XAsyncBlock async{};
    HRESULT hr = PFAuthenticationLoginWithSteamAsync(serviceConfigHandle, &request, &async); // Add your own error handling when FAILED(hr) == true
    hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage

    std::vector<char> loginResultBuffer;
    PFAuthenticationLoginResult const* loginResult;
    size_t bufferSize;
    hr = PFAuthenticationLoginWithSteamGetResultSize(&async, &bufferSize);
    loginResultBuffer.resize(bufferSize);

    PFEntityHandle entityHandle{ nullptr };
    hr = PFAuthenticationLoginWithSteamGetResult(&async, &entityHandle, loginResultBuffer.size(), loginResultBuffer.data(), &loginResult, nullptr);
```

## サービス呼び出し

プレイヤーをログインさせた後、PlayFab バックエンドへの呼び出しを行うことができます。現在のプレイヤーの PlayFab に保存されたファイルを取得する呼び出しの例を示します。

### EntityKey の取得

PlayFab の一部の呼び出しにおいて、プレイヤーの **PFEntityKey** を知ることが有用な場合があります。**PFEntityToken** を取得したら、**PFEntityGetEntityKey** で **PFEntityKey** を取得できます。

```cpp theme={null}
    PFEntityKey const* pEntityKey{};
    std::vector<char> entityKeyBuffer;
    size_t size{};
    HRESULT hr = PFEntityGetEntityKeySize(entityHandle, &size); // Add your own error handling when FAILED(hr) == true

    entityKeyBuffer.resize(size);
    hr = PFEntityGetEntityKey(entityHandle, entityKeyBuffer.size(), entityKeyBuffer.data(), &pEntityKey, nullptr);
```

### GetFiles の呼び出し

すべての PlayFab 呼び出しは、リクエストオブジェクトを準備し、(ログインで得られた **PFEntityHandle** を使用して) 呼び出しを行い、レスポンスを受け取るオブジェクトを作成し、**GetResult** 関数を呼び出して新しく作成されたコンテナに値を格納するという、類似したパターンに従います。

```cpp theme={null}
    XAsyncBlock async{};
    PFDataGetFilesRequest requestFiles{};
    requestFiles.entity = pEntityKey;

    HRESULT hr = PFDataGetFilesAsync(entityHandle, &requestFiles, &async); // Add your own error handling when FAILED(hr) == true
    hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage

    size_t resultSize;
    hr = PFDataGetFilesGetResultSize(&async, &resultSize);

    std::vector<char> getFilesResultBuffer(resultSize);
    PFDataGetFilesResponse* getFilesResponseResult{ nullptr };
    hr = PFDataGetFilesGetResult(&async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr);
```

## クリーンアップ

ゲームをシャットダウンする準備ができたとき、または何らかの理由で PlayFab をクリーンアップする必要があるときは、開いているすべてのハンドルを閉じ、**PFServicesUninitializeAsync** を呼び出してください。

```cpp theme={null}
    PFEntityCloseHandle(entityHandle);
    entityHandle = nullptr;

    PFServiceConfigCloseHandle(serviceConfigHandle);
    serviceConfigHandle = nullptr;

    XAsyncBlock async{};
    HRESULT hr = PFServicesUninitializeAsync(&async); // Add your own error handling when FAILED(hr) == true
    hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage
```

## 非同期 API パターン

PlayFab Services SDK は、GDK に実装されている [非同期プログラミング モデル](https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/system/overviews/async-programming-model) に従います。このプログラミング モデルでは、[XAsync ライブラリ](/build/core-features/common/async/async-libraries/async-library-xasync) が提供する Task と Task Queue を使用します。このモデルは、他の GDK 関数や拡張機能 (XBOX Services API など) と一貫しています。多少の複雑さは伴いますが、非同期操作を高度に制御することができます。

以下の例は、**PFDataGetFilesAsync** を非同期に呼び出す方法を示しています。

```cpp theme={null}
    auto async = std::make_unique<XAsyncBlock>();
    async->callback = [](XAsyncBlock* async)
    {
        std::unique_ptr<XAsyncBlock> asyncBlockPtr{ async }; // take ownership of XAsyncBlock

        size_t resultSize;
        HRESULT hr = PFDataGetFilesGetResultSize(async, &resultSize);
        if (SUCCEEDED(hr))
        {
            std::vector<char> getFilesResultBuffer(resultSize);
            PFDataGetFilesResponse* getFilesResponseResult{ nullptr };
            PFDataGetFilesGetResult(async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr);
        }
    };

    PFDataGetFilesRequest requestFiles{};
    requestFiles.entity = m_pEntityKey;
    HRESULT hr = PFDataGetFilesAsync(m_entityHandle, &requestFiles, async.get());
    if (SUCCEEDED(hr))
    {
        async.release(); // at this point, the callback will be called so release the unique ptr
    }

```

## エラー処理

完了した **XAsync** 操作は HTTP ステータスコードを返します。エラーステータスコードは、**XAsyncGetStatus()** または **PF\*Get()** API のいずれかを呼び出したときに、**HTTP\_E\_STATUS\_NOT\_FOUND** のような失敗を表す **HRESULT** として現れます。

サービスから返される詳細なエラーメッセージを確認するには、次のデバッグに関するセクションを参照してください。これらの詳細なエラーメッセージは、開発中に PlayFab サービスがクライアントからのリクエストにどのように反応するかをより深く理解するのに役立ちます。

## デバッグ

PlayFab Services SDK での結果を確認し、呼び出しをデバッグする最も簡単な方法は、[デバッグ トレース](/services/playfab/sdks/c/tracing) を有効にすることです。デバッグ トレースを有効にすると、デバッガーの出力ウィンドウで結果を確認できるだけでなく、ゲーム独自のログに結果をフックすることもできます。

## リファレンス

[API リファレンス ドキュメント](/services/playfab/api-references/c/pfauthentication/pfauthentication_members)


## Related topics

- [PlayFab がサポートする言語](/ja-jp/services/playfab/sdks/languages/index.md)
- [Windows 向け C++ クイックスタート](/ja-jp/services/playfab/sdks/playfab-cpp/quickstart-windows.md)
- [クイックスタート](/ja-jp/services/playfab/economy-monetization/economy-v2/quickstart.md)
- [クイックスタート iOS](/ja-jp/services/playfab/sdks/c/quickstart-ios.md)
- [クイックスタート Linux](/ja-jp/services/playfab/sdks/c/quickstart-linux.md)
