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
게임 저장 오류