XGameSaveReadBlobData
コンテナーの BLOB データを読み取ります。
構文
HRESULT XGameSaveReadBlobData(
XGameSaveContainerHandle container,
const char** blobNames,
uint32_t* countOfBlobs,
size_t blobsSize,
XGameSaveBlob* blobData
)
パラメーター
container _In_
型: XGameSaveContainerHandle
XGameSaveBlob データが格納されている XGameSaveContainer に対するハンドル。
blobNames _In_opt_z_count_(countOfBlobs)
型: char*
XGameSaveBlob の名前を表す文字列の配列へのポインター。
countOfBlobs _Inout_
型: uint32_t*
読み取る BLOB の数。
blobsSize _In_
型: size_t
割り当てられた BLOB データのサイズ。BLOB のメタデータを読み取ることで推定できます。
blobData _Out_writes_bytes_(blobsSize)
型: XGameSaveBlob*
BLOB データを格納するための XGameSaveBlob のポインター。 要求したすべての BLOB をコンテナーから格納するためのメモリを割り当てる必要があります。
戻り値
型: HRESULT
関数の結果です。
一般的なエラー
- E_GS_INVALID_CONTAINER_NAME
- E_GS_PROVIDED_BUFFER_TOO_SMALL
- E_GS_BLOB_NOT_FOUND
- E_GS_CONTAINER_NOT_IN_SYNC
- E_GS_CONTAINER_SYNC_FAILED
- E_GS_HANDLE_EXPIRED
解説
注意
この関数は、時間依存のスレッドで呼び出すのに安全ではありません。 詳細については、「時間依存のスレッド」を参照してください。
セーブ データの BLOB 内のデータを読み取るには、この関数を使用します。 この関数では、BLOB の数と BLOB コンテナー内のデータが返されます。 これらを使用して、コンテナー内の BLOB を反復処理し、適切な情報を読み取ることができます。 この関数には、XGameSaveReadBlobDataAsync という名前の非同期バージョンがあります。
// SYNC Read - should not be called on time sensitive thread
// as this will block until the operation is complete
void Sample::_ReadContainerBlobsSync(const XGameSaveContainerInfo* container)
{
const char* blobNames[] = {
"WorldState",
"PlayerState",
"PlayerInventory"
};
XGameSaveContainerHandle containerContext = nullptr;
size_t allocSize;
uint32_t countOfBlobs = _countof(blobNames);
XGameSaveBlob* blobs = nullptr;
HRESULT hr = XGameSaveCreateContainer(_provider, container->name, &containerContext);
if (SUCCEEDED(hr))
{
// this method finds the size for only the blobs in the container
// that we are requesting to read right now
hr = _GetContainerBlobsDataSize(container, blobNames, _countof(blobNames), &allocSize);
}
if (SUCCEEDED(hr))
{
blobs = reinterpret_cast<XGameSaveBlob*>(malloc(allocSize));
if (blobs == nullptr)
{
hr = E_OUTOFMEMORY;
}
}
if (SUCCEEDED(hr))
{
hr = XGameSaveReadBlobData(containerContext, blobNames, &countOfBlobs, allocSize, blobs);
}
if (SUCCEEDED(hr))
{
if (countOfBlobs == _countof(blobNames))
{
for (uint32_t i = 0; i < countOfBlobs; i++)
{
XGameSaveBlob* currentBlob = blobs + i;
if (strcmp(currentBlob->info.name, "WorldState") == 0)
{
hr = _LoadSaveBlob(currentBlob, _worldState);
}
else if (strcmp(currentBlob->info.name, "PlayerState") == 0)
{
hr = _LoadSaveBlob(currentBlob, _playerState);
}
else if (strcmp(currentBlob->info.name, "PlayerInventory") == 0)
{
hr = _LoadSaveBlob(currentBlob, _playerInventory);
}
if (FAILED(hr))
{
break;
}
}
}
else
{
hr = E_UNEXPECTED;
}
}
_HandleContainerBlobErrors(hr);
if (blobs != nullptr)
{
free(blobs);
}
if (containerContext != nullptr)
{
XGameSaveCloseContainer(containerContext);
}
}
void Sample::_HandleContainerBlobErrors(HRESULT hr)
{
// set some state
switch (hr)
{
case E_GS_INVALID_CONTAINER_NAME:
// tried to access a container with an invalid name
break;
case E_GS_PROVIDED_BUFFER_TOO_SMALL:
// shouldn't ever happen unless our math is wrong!!
break;
case E_GS_BLOB_NOT_FOUND:
// we asked for a blob that isn't in the container
break;
case E_GS_CONTAINER_NOT_IN_SYNC:
case E_GS_CONTAINER_SYNC_FAILED:
// need to sync and we are offline ?
break;
case E_GS_HANDLE_EXPIRED:
// need to re-initialize since another device has taken
// ownership while we were suspended and/or busy
break;
}
}
要件
ヘッダー: XGameSave.h
ライブラリ: xgameruntime.lib
サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体
関連項目
XGameSave
XGameSaveBlobInfo
XGameSaveReadBlobDataAsync
ゲームのセーブ エラー