Skip to content
스토브
마지막 업데이트

구 C++ API에서 신규 C API로 옮기기

3.4.x 이전의 C++ API(Stove::PCSDK 네임스페이스, Base_* · IAP_* · View_* 계열)로 이미 연동을 마친 게임이 3.5.0 신규 C API(Stove_* 계열)로 코드를 옮길 때 참고하는 문서예요.

신규 API로 반드시 옮겨야 하는 것은 아니에요. 3.4.x API는 계속 제공되므로, 기존 연동 코드를 그대로 두고 배포 파일만 3.5.0으로 교체해도 돼요. 이 문서는 신규 API로 코드를 변경하기로 결정한 경우에만 필요해요.

다음 순서로 읽으시면 돼요.

  1. 신규 API의 기본 구조를 먼저 확인해요. (1장)
  2. 현재 사용 중인 함수와 구조체가 무엇으로 바뀌는지 확인해요. (2장 · 3장)
  3. 신규 API에 없는 기능을 사용하고 있는지 확인해요. (4장)
  4. 코드를 변경할 때 호출 형태가 달라지는 부분을 확인해요. (5장)

1. 신규 API 기본 구조

신규 인터페이스의 규칙은 레퍼런스가이드 맨 앞의 기본 연동 안내에 정리되어 있어요. 이 장에서는 코드를 옮길 때 알아야 하는 내용만 간략하게 정리해요.

배포 파일이 하나로 줄어들어요

신규 API를 사용하면 게임과 함께 배포해야 하는 파일은 BaseSDK.dll 하나예요. 모듈마다 배포하던 IAPSDK.dll · ViewSDK.dll · PCBangSDK.dll 같은 파일은 더 이상 포함하지 않아도 돼요. 모든 기능이 하나의 바이너리에 통합되었기 때문이에요.

기존 3.4.x API로 연동한 게임은 배포 구성을 그대로 유지하세요. 바이너리가 통합된 것과 관계없이 지금까지 배포하던 모듈별 파일을 계속 포함해야 해요. 배포 파일이 하나로 줄어드는 것은 신규 API로 옮긴 경우에만 해당해요.

모듈 구분이 없어졌어요

모듈마다 초기화하던 절차가 사라졌어요. Stove_Initialize 를 한 번 호출하면 결제 · 팝업 · PC방 · 로그 기능을 모두 사용할 수 있고, 종료할 때도 Stove_Uninitialize 하나만 호출해요.

함수 이름에서도 모듈 이름이 제거되었어요. 접두사는 Stove_ 하나로 통일되었어요.

text
Base_GetUser        ->  Stove_GetUser
IAP_StartPurchase   ->  Stove_StartPurchase
View_AutoPopup      ->  Stove_AutoPopup

구조체 대신 인터페이스 포인터를 사용해요

구 API는 값 구조체(StovePCUser 등)를 직접 선언해서 주고받았어요. 신규 API는 모든 객체를 IStove* 포인터로 다루고, 값은 접근자로 조회해요.

cpp
// 구 C++
StovePCUser user;
Base_GetUser(&user);
const wchar_t* nickname = user.GetNickname();

신규 API의 접근자는 C 함수와 C++ 메서드 두 가지 형태로 제공되며, 두 형태의 동작은 완전히 같아요. 프로젝트 환경에 맞는 형태를 선택하시면 돼요.

c
IStoveUser* user = nullptr;
Stove_GetUser(&user);
const wchar_t* nickName = Stove_IStoveUser_GetNickName(user);

C 함수의 이름은 Stove_<인터페이스>_<멤버> 형태로 규칙이 일정해요. SDK 함수(Stove_GetUser 등)는 자유 함수이므로 두 형태에서 호출 방법이 같아요.

파라미터도 객체로 생성해요

호출에 전달하는 파라미터도 구조체를 선언하는 방식이 아니라 팩토리 패턴으로 생성해요. 어떤 파라미터를 생성할지는 EStove<모듈>TypeKind 값으로 지정해요.

c
IStoveInitializeParam* initParam =
    (IStoveInitializeParam*)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");

전달받은 객체는 해제해야 해요

SDK가 생성한 객체는 사용을 마친 뒤에 해제해요. 해제해야 하는 객체인지는 ShouldDestroy 로 판단해요.

c
if (Stove_IStoveTypeBase_ShouldDestroy(obj))
    Stove_IStoveTypeBase_Destroy(obj);

구 API에는 없던 규칙이므로 코드를 옮길 때 가장 자주 누락되는 부분이에요. 자세한 내용은 5장에서 설명해요.

C와 C++ 두 형태로 제공해요

헤더는 모듈마다 네 가지로 나뉘며, 전체를 한 줄로 포함할 수 있는 stove_api.h 도 함께 제공돼요. 단일 바이너리라서 모든 모듈의 헤더가 BaseSDK/Public/C/ 한 폴더에 함께 들어 있어요.

배포 패키지에는 파트너스 게임에서 쓸 수 없는 모듈의 헤더도 함께 들어 있어요. 소유권(ownership_*)과 통계·업적(game_support_*)은 스토어인디 게임 전용이에요. stove_api.h 로 한 번에 포함하면 이 헤더들도 따라 들어오지만, 파트너스 게임에서는 제공되지 않는 기능이니 호출하지 마세요. 헤더가 있다고 해서 쓸 수 있는 기능은 아니에요.

헤더역할
<module>_api.hSDK 함수 선언 (Stove_Initialize 등)
<module>_types.h인터페이스 정의. C++ 환경에서는 순수 가상 함수, C 환경에서는 불투명 타입이에요
<module>_flat_api.h인터페이스 멤버에 접근하는 C 함수 (Stove_<인터페이스>_<멤버>)
<module>_misc.h열거형 정의

2. 함수 대응

초기화와 종료

모듈별 초기화 · 종료 · 버전 조회 함수는 신규 API에 없어요. 세 개의 함수로 통합되었어요.

구 C++신규 C변경된 내용
Base_Initialize · Base_InitializeExStove_Initialize모듈별 초기화가 사라졌어요
IAP_Initialize · IAP_InitializeWithWndInfoStove_Initialize창 핸들은 IStoveInitializeParam 에 설정해요
View_Initialize · View_InitializeWithWndInfoStove_Initialize
PCBang_Initialize · Log_Initialize · GamingServices_InitializeStove_Initialize
Base_UnInitialize 와 모듈별 *_UnInitializeStove_Uninitialize대문자 표기가 Uninitialize 로 바뀌었어요
Base_GetVersion 과 모듈별 *_GetVersionStove_GetVersion
Base_RestartAppIfNecessary · Base_RestartAppIfNecessaryAsync · ~AsyncEx · ~AsyncEx2Stove_RestartAppIfNecessary네 개의 함수가 하나로 통합되었어요
Base_RunCallbackStove_RunCallback
Base_RunCallbackWithTimeoutStove_RunCallbackWithTimeout

사용자 정보와 환경

구 C++신규 C
Base_GetUserStove_GetUser
Base_GetSigninStove_GetSignin
Base_GetGdsStove_GetGds
Base_GetAccessTokenStove_GetAccessToken
Base_AccessTokenRenewedStove_AccessTokenRenewed
Base_SetGameProfileStove_SetGameProfile
Base_SetLanguage · Base_SetLanguageExStove_SetLanguage
Base_OpenExternalUrlStove_OpenExternalUrl

규제 대응 알림

구 C++신규 C
Base_ShutdownNotificationStove_ShutdownNotification
Base_OverImmersionNotificationStove_OverImmersionNotification
Base_VietnamAgeRatingNotificationStove_VietnamAgeRatingNotification
Base_VietnamOverimmersionNotificationStove_VietnamOverimmersionNotification

결제

구 C++신규 C변경된 내용
IAP_FetchProducts · IAP_FetchProductsExStove_FetchProductsEx 함수가 제공하던 구매 가능 여부 코드가 기본 결과에 포함되어 있어요
IAP_FetchShopCategoriesStove_FetchShopCategories
IAP_FetchInventoryStove_FetchInventory
IAP_StartPurchase · IAP_StartPurchaseExStove_StartPurchase팝업이 닫힐 때 호출되는 콜백이 기본 인자에 포함되어 있어요
IAP_ConfirmPurchaseStove_ConfirmPurchase
IAP_FetchTermsAgreement · IAP_FetchTermsAgreementExStove_FetchTermsAgreement
IAP_WithdrawGameStove_WithdrawGame
IAP_CloseAllPopupsStove_CloseAllPopups팝업 기능과 하나로 통합되었어요

팝업

구 C++신규 C변경된 내용
View_AutoPopup · View_AutoPopupExStove_AutoPopup팝업이 닫힐 때 호출되는 콜백이 기본 인자에 포함되어 있어요
View_ManualPopup · View_ManualPopupExStove_ManualPopup
View_NewsPopup · View_NewsPopupExStove_NewsPopup
View_CouponPopup · View_CouponPopupExStove_CouponPopup
View_VerifyIdentificationPopupStove_VerifyIdentificationPopup
View_SetPopupDisallowedStove_SetPopupDisallowed
View_CloseAllPopupsStove_CloseAllPopups결제 기능과 하나로 통합되었어요

PC방

구 C++신규 C
PCBang_CheckPCBangStatusStove_PCBangCheckStatus
PCBang_UserLoginStove_PCBangLogin
PCBang_UserLogoutStove_PCBangLogout

로그

구 C++신규 C
Log_SendStove_SendLog

3. 구조체와 열거형 대응

공통

구 C++신규 C변경된 내용
ResultIStoveResult값이 아니라 포인터예요. 사용을 마치면 해제해요
CallbackResultIStoveCallbackResult
SDKResultCode (모듈마다 별도로 존재했어요)EStoveCommonResultCode · EStoveResultCode5.6절에서 설명해요
SDKMethod (모듈마다 별도로 존재했어요)EStove<모듈>MethodCode
없음EStove<모듈>TypeKind새로 추가되었어요. 객체의 구체적인 타입을 식별해요
없음IStoveTypeBase새로 추가되었어요. 모든 객체의 최상위 인터페이스이며 해제를 담당해요

사용자 정보와 환경

구 C++신규 C
StovePCUserIStoveUser
StovePCSigninIStoveSignin
StovePCGdsIStoveGds
StovePCTokenIStoveAccessToken
StovePCInitializeParam · StovePCInitializeParamEx2IStoveInitializeParam · IStoveRestartAppIfNecessaryParam
StovePCGameProfileIStoveSetGameProfileParam
StoveLanguage열거형을 사용하지 않고 언어 코드 문자열을 전달해요

규제 대응 알림

구 C++신규 C
StovePCShutdownIStoveShutdownInfo
StovePCOverImmersionIStoveOverImmersionInfo
StovePCVietnamAgeRatingInfoIStoveVietnamAgeRatingInfo
StovePCVietnamOverimmersionInfoIStoveVietnamOverimmersionInfo
StoveOverlayStateEStoveOverlayMode

결제

구 C++신규 C변경된 내용
StovePCProduct · StovePCProductExIStoveProduct하나로 통합되었어요
상품 배열과 개수IStoveProductList목록을 담는 객체로 바뀌었어요
StovePCShopCategoryIStoveShopCategory · IStoveShopCategoryList
StovePCInventoryItemIStoveInventoryItem · IStoveInventoryList
StovePCPurchasedProductIStovePurchasedProduct
StovePCChargeInfoIStoveChargeInfo
StovePCOrderProductIStoveOrderProductParam
StovePCStartPurchaseParamIStoveStartPurchaseParam
StovePCPurchaseOptionIStovePurchaseParam
StovePCPurchaseResultIStoveStartPurchaseOutcome
StovePCFetchProductParamIStoveFetchProductsParam
StovePCTermsOptionIStoveFetchTermsAgreementParam
약관 동의 결과IStoveTermsAgreementOutcome결과를 담는 객체가 새로 추가되었어요
구매 확정 요청과 결과IStoveConfirmPurchaseParam · IStoveConfirmPurchaseOutcome
StovePCWithdrawGameOptionIStoveWithdrawGameParam · IStoveWithdrawGameOutcome
DiscountTypeEStoveDiscountType
ProductTypeCodeEStoveProductTypeCode
PurchaseLimitTypeCodeEStovePurchaseLimitTypeCode
PurchaseProgressEStovePurchaseProgress
StovePCPurchaseOperationEStovePurchaseOperation
StovePCTermsOperationEStoveTermsOperation

팝업

구 C++신규 C변경된 내용
팝업 옵션IStovePopupParam자동 · 뉴스 · 쿠폰 팝업이 공통으로 사용해요
수동 팝업 옵션IStoveManualPopupParam
StovePCPopupDisallowedIStoveSetPopupDisallowedParam
본인 인증 팝업 옵션IStoveVerifyIdentificationPopupParam · IStoveVerifyIdentificationPopupDestroyInfo
웹뷰 위치와 크기 필드IStoveWebViewLayoutParam웹뷰를 사용하는 파라미터가 공통으로 사용해요
WebViewModeEStoveWebViewMode

PC방과 로그

구 C++신규 C
StovePCBangStatusIStovePCBangStatus
StovePCBangUserLoginIStovePCBangLoginOutcome
StovePCRefreshUserBenefitsIStovePCBangBenefitInfo
PCBangPremiumEStovePCBangPremium
StovePCLogSendParamIStoveSendLogParam

4. 신규 API에 없는 기능

다음 항목은 신규 C API에 대응하는 함수와 구조체가 없어요. 해당 기능을 사용하고 있다면 코드를 옮기기 전에 대체 방법을 먼저 결정해야 해요.

함수

구 C++안내
Base_GetShutdown값을 직접 조회하지 않고 Stove_ShutdownNotification 콜백으로 전달받아요
Base_GetOverImmersionStove_OverImmersionNotification 콜백으로 전달받아요
Base_GetRenewTokenStove_AccessTokenRenewed 콜백으로 전달받아요
Base_GetTraceHint대응하는 함수가 없어요. 기존에도 폐기 예정이던 기능이에요
IAP_StartPayment · IAP_StartPaymentEx결제는 Stove_StartPurchase 로 통합하여 진행해요
IAP_FetchVoidedPurchases · IAP_FetchVoidedPurchasesEx대응하는 함수가 없어요. 기존에도 폐기 예정이던 기능이에요
View_FetchWebOpenKey대응하는 함수가 없어요. 기존에도 폐기 예정이던 기능이에요
GamingServices_FetchCharacter에픽세븐과 같은 특정 개발사 전용 인터페이스이며 앞으로 폐기될 예정이므로 신규 인터페이스에서 제공하지 않아요. 이 기능이 필요하다면 기존 C++ 인터페이스를 그대로 사용하시거나 플랫폼 API를 직접 호출하는 방식으로 변경하셔야 해요

구조체와 열거형

구 C++안내
StovePCTraceHintBase_GetTraceHint 와 함께 제거되었어요
StovePCVoidedPurchase · StovePCVoidedPurchasesEx · StovePCVoidedPurchasesMarketType환불 내역 조회 기능과 함께 제거되었어요
StovePCPaymentOption · StovePCPaymentOperationIAP_StartPayment 와 함께 제거되었어요
CloseButtonType대응하는 열거형이 없어요. 기존에도 폐기 예정이던 기능이에요

배포에는 들어 있지만 파트너스 게임에서 쓸 수 없는 함수

아래 함수는 신규 API에 있고 헤더에도 선언되어 있지만 스토어인디 게임 전용이에요. 파트너스 게임에는 제공되지 않으니 코드를 옮길 때 그냥 넘어가세요. 구 API에서도 이 기능은 파트너스 게임에 제공되지 않았어요.

신규 API구 API기능
Stove_FetchOwnershipsOwnership_OwnershipList소유권 조회
Stove_FetchAchievement · Stove_FetchAchievementsGameSupport_Achievement · GameSupport_AllAchievement업적 조회
Stove_FetchStat · Stove_SetStatGameSupport_Stat · GameSupport_ModifyStat통계 조회와 수정
Stove_FetchRankingGameSupport_Rank리더보드 조회
Stove_GetCloudSavingPathBase_GetCloudSavingPath클라우드 세이브 경로 조회

stove_api.h 로 헤더를 한 번에 포함하면 위 함수의 선언도 따라 들어와요. 편집기 자동 완성 목록에 보이더라도 호출하지 마세요.

없어진 방식

  • Ex · Ex2 확장 함수: 신규 API는 확장 함수를 별도로 제공하지 않아요. 기존 Ex 계열이 담당하던 기능, 즉 팝업이 닫힐 때 호출되는 콜백과 추가된 응답 필드, 확장된 파라미터는 모두 기본 함수 하나에 포함되어 있어요.
  • 모듈별 초기화: 결제나 팝업 기능을 사용하기 위해 모듈을 개별적으로 초기화하던 절차가 없어졌어요.
  • 모듈별 결과 코드: 모듈마다 존재하던 SDKResultCode 가 공통 코드와 기능별 코드 두 가지로 정리되었어요.

5. 코드를 변경할 때 달라지는 부분

이름만 바꾸면 빌드되지 않아요. 호출 형태가 함께 바뀌기 때문이에요. 다음 여섯 가지가 실제로 코드를 수정해야 하는 부분이에요.

5.1 동기 함수는 결과를 포인터로 반환해요

구 API는 Result 값을 반환했고, 결과 구조체는 호출하는 쪽에서 선언하여 주소를 전달했어요. 신규 API는 IStoveResult* 를 반환하고, 결과 객체는 이중 포인터로 전달받아요.

cpp
// 구 C++
StovePCUser user;
Result result = Base_GetUser(&user);
if (result.IsSuccessful())
{
    const wchar_t* nickname = user.GetNickname();
}
c
IStoveUser* user = nullptr;
IStoveResult* result = Stove_GetUser(&user);
if (Stove_IStoveResult_IsSuccessful(result))
{
    const wchar_t* nickName = Stove_IStoveUser_GetNickName(user);
    Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)user);
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
  • 성공 여부는 IsSuccessful() 로 확인해요. try-catch 는 사용하지 않아요.
  • 결과 코드는 GetResultCode() 로 확인하고, 어느 함수가 생성한 결과인지는 GetMethodCode() 로 확인해요.

5.2 전달받은 객체는 해제해요

구 API의 값 구조체는 범위를 벗어나면 자동으로 정리되었어요. 신규 API에서 SDK가 생성한 객체는 호출하는 쪽에서 해제해야 해요.

c
if (Stove_IStoveTypeBase_ShouldDestroy(obj))
    Stove_IStoveTypeBase_Destroy(obj);
  • 반환받은 IStoveResult* 는 해제해요.
  • Stove_CreateParam() 으로 생성한 파라미터도 호출이 끝나면 해제해요.
  • 콜백으로 전달받은 객체는 각 문서의 메모리 관리 표를 확인하세요. SDK가 소유하고 있어서 해제하면 안 되는 객체도 있어요.
  • 문서에서 확인하기 어렵다면 위와 같이 ShouldDestroy 로 판단할 수 있어요.

5.3 파라미터는 팩토리 패턴으로 생성해요

cpp
// 구 C++
StovePCInitializeParam initParam;
initParam.SetShopKey(L"YOUR_SHOP_KEY");
Base_Initialize(&initParam, OnInitializeFinished);
c
IStoveInitializeParam* initParam =
    (IStoveInitializeParam*)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");

IStoveResult* result = Stove_Initialize(initParam);
// 결과를 확인합니다.

Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam);

Stove_CreateParam() 에 전달하는 값은 생성하려는 파라미터의 TypeKind 이에요. 어떤 값을 전달해야 하는지는 각 파라미터 문서에 기재되어 있어요.

5.4 초기화 흐름이 짧아져요

text
구 C++ : Base_RestartAppIfNecessaryAsync -> Base_Initialize
         -> IAP_Initialize -> View_Initialize -> PCBang_Initialize -> Log_Initialize

신규 C : Stove_RestartAppIfNecessary -> Stove_Initialize
  • 모듈별 초기화 호출을 모두 제거해요. 남겨 두면 빌드되지 않아요.
  • 종료할 때도 Stove_Uninitialize 를 한 번만 호출해요. 표기가 UnInitialize 에서 Uninitialize 로 바뀐 점에 주의하세요.
  • Stove_Initialize 는 동기 함수예요. 완료 콜백을 기다리지 않고 반환값으로 성공 여부를 바로 확인해요.

5.5 콜백에 사용자 데이터 인자를 함께 넘겨요

비동기 함수는 콜백과 함께 void* userData 를 전달받아요. 콜백에서 게임 쪽 객체를 다시 찾아야 할 때 전역 변수 대신 이 값을 사용할 수 있어요.

구 C++ API(IAP_* · View_* 계열)에는 이 인자가 없어요. 다만 그보다 앞선 StoveAPI_* 벌에는 같은 방식이 있었으므로, StoveAPI_StartPurchaseEx 처럼 userData 를 넘기던 코드에서 옮겨 온다면 새로운 방식이 아니에요.

cpp
// 구 C++
void IAP_StartPurchase(const StovePCStartPurchaseParam* params,
                       OnStartPurchaseFinished onFinished);
c
// 신규 C
void Stove_StartPurchase(const IStoveStartPurchaseParam* params,
                         OnStartPurchaseCallback onFinished,
                         OnIAPPopupDestroyCallback onDestroy,
                         void* userData1, void* userData2);
  • SDK 함수는 자유 함수이므로 C 환경과 C++ 환경에서 선언이 같아요.
  • 팝업을 여는 함수는 완료 콜백과 팝업이 닫힐 때 호출되는 콜백을 함께 전달받아요. 구 API에서 Ex 함수를 사용하던 부분이 여기에 해당해요.
  • 닫힘 콜백이 필요하지 않으면 nullptr 을 전달해요.
  • 콜백이 실행되는 시점은 이전과 같아요. Stove_RunCallback() 을 호출한 스레드에서 실행되므로 게임 루프에서 계속 호출해야 해요.

5.6 결과 코드 체계가 바뀌었어요

구 API는 모듈마다 SDKResultCode 를 별도로 두었어요. 신규 API는 두 가지로 정리되었어요.

범위열거형포함하는 코드
0 ~ 299EStoveCommonResultCode모든 기능이 공통으로 사용하는 코드
300 이상EStoveResultCode기능별로 구분되는 코드
  • 값을 숫자로 비교하는 코드가 있다면 새 열거형과 하나씩 대조하세요. 같은 숫자가 다른 의미일 수 있어요.
  • 열거형 값의 이름은 k_E<열거형><값> 형태예요. 성공은 k_EStoveCommonResultCode_Success 이에요.
  • 사용자에게 안내 화면을 표시해야 하는 코드인지는 각 결과 코드 문서의 표에서 확인할 수 있어요.

6. 옮기는 순서

한 번에 전부 변경하기보다 다음 순서로 나누어 진행하면 중간에 동작을 확인하기 쉽어요.

  1. 헤더와 링커 설정을 먼저 교체해요. 구 API 헤더를 제거하고 신규 API 헤더로 바꾸는 작업이며, 6.1절에서 자세히 설명해요.
  2. 초기화와 종료를 변경해요. 모듈별 초기화를 제거하고 Stove_Initialize · Stove_Uninitialize 로 정리한 뒤에 게임이 실행되는지 확인해요.
  3. 동기 조회 함수를 변경해요. Stove_GetUser · Stove_GetGds 처럼 값을 바로 반환받는 함수부터 옮기면서 객체를 해제하는 규칙에 익숙해져요.
  4. 비동기 함수를 변경해요. 결제 · 팝업 · PC방처럼 콜백을 사용하는 기능을 옮겨요. Ex 함수를 사용하던 부분은 닫힘 콜백 인자로 정리해요.
  5. 결과 코드 분기를 점검해요. 숫자로 비교하던 부분과 모듈별 코드를 사용하던 부분을 새 열거형으로 변경해요.
  6. 배포 구성을 정리해요. 모듈별 파일을 제외하고 BaseSDK.dll 하나만 포함하도록 변경해요.
  7. 4장을 다시 확인해요. 대체 방법이 필요한 기능이 남아 있는지 마지막으로 점검해요.

6.1 헤더 교체와 include 문 변경

구 API의 헤더는 배포 패키지의 Include 폴더에 모듈마다 하나씩 들어 있고, 열거형과 구조체, 콜백 선언은 Include/Misc 폴더에 들어 있어요. 신규 API의 헤더는 BaseSDK/Public/C 한 폴더에 모듈마다 네 종류씩 들어 있어요.

구분구 API신규 API
헤더 위치{SDK_Root}/Include/{SDK_Root}/Include/Misc/BaseSDK/Public/C/ 한 폴더
모듈 헤더BaseSDK.h · IAPSDK.h · ViewSDK.h · PCBangSDK.h · LogSDK.hbase_api.h · iap_api.h · view_api.h · pcbang_api.h · log_api.h (모듈마다 네 종류)
통합 헤더없어요stove_api.h

프로젝트 설정에서 구 API의 헤더 경로를 제거하고 신규 API의 헤더 경로를 포함 디렉터리에 추가한 뒤에, 소스의 include 문을 바꿔요.

cpp
// 구 C++
#include "BaseSDK.h"
#include "IAPSDK.h"
#include "ViewSDK.h"
#include "PCBangSDK.h"

가장 간단한 방법은 통합 헤더 한 줄로 바꾸는 것이에요. 모든 모듈의 네 종류 헤더가 함께 포함되므로 C 접근자도 바로 사용할 수 있어요.

c
// 신규: 통합 헤더 한 줄로 모든 모듈을 포함합니다.
#include "stove_api.h"

필요한 모듈만 선택해서 포함할 수도 있어요. 이때 C 환경에서 인터페이스 멤버에 접근하려면 <module>_flat_api.h 를 함께 포함해야 해요.

c
// 신규: 모듈을 선택해서 포함하는 경우
#include "base_api.h"
#include "base_flat_api.h"
#include "iap_api.h"
#include "iap_flat_api.h"
#include "view_api.h"
#include "view_flat_api.h"
  • <module>_api.h<module>_types.h 를, <module>_types.h<module>_misc.h 를 포함해요. 따라서 열거형과 구조체 헤더를 따로 추가하지 않아도 돼요.
  • C++ 메서드 형태만 사용한다면 <module>_flat_api.h 는 포함하지 않아도 돼요.
  • 구 API의 Include/Misc 아래 헤더를 직접 포함하던 코드가 있다면 함께 제거해요. 신규 API에는 같은 이름의 헤더가 없어요.
  • 링커의 추가 종속성에 모듈별 lib 파일을 나열해 두었다면 배포 패키지의 Lib 폴더 구성에 맞추어 정리해요. 게임과 함께 배포하는 바이너리는 BaseSDK.dll 하나예요.

부록. 결과 코드 대응표

구 API는 모듈마다 결과 코드를 따로 두어서 같은 번호가 모듈에 따라 다른 뜻이었어요. 예를 들어 80 은 공통 기능에서는 언어 미설정, 결제와 팝업에서는 UI 미초기화, 로그에서는 작업 디렉터리 생성 실패였어요. 신규 API는 번호 하나가 한 가지 뜻만 가지도록 정리했어요.

번호가 그대로인 코드

아래 코드는 번호가 바뀌지 않았어요. 이름 표기만 대문자 밑줄에서 파스칼 표기로 달라졌어요.

코드구 이름신규 이름
0SUCCESSSuccess
1FAILFail
2INVALID_CONFIGInvalidConfig
3INVALID_LOG_LEVELInvalidLogLevel
4INVALID_LOG_PATHInvalidLogPath
5INVALID_PARAMInvalidParam
16BASE_NOT_INITIALIZEDBaseNotInitialized
17NOT_INITIALIZEDNotInitialized
18ALREADY_INITIALIZEDAlreadyInitialized
19INVALID_ACCESS_TOKENInvalidAccessToken
20NULL_TOKEN_ENTITYNullTokenEntity
21NULL_ENTITYNullEntity
22HTTP_ERRORHttpError
23RESPONSE_ERRORResponseError
24RESPONSE_INVALID_CODEResponseInvalidCode
25RESPONSE_VALUE_IS_NULLResponseValueIsNull
26RESPONSE_INVALID_VALUE_FORMATResponseInvalidValueFormat
29ASYNC_OPERATION_IN_PROGRESSAsyncOperationInProgress
30BASE_UNINITIALIZEDBaseUninitialized
31NOT_SUPPORTED_COUNTRYNotSupportedCountry
251PCSDK_DLL_NOT_FOUNDPcsdkDllNotFound
252NOT_IMPLEMENTEDNotImplemented
253UNMANAGED_EXCEPTIONUnmanagedException
254MANAGED_EXCEPTIONManagedException
255UNKNOWN_ERRORUnknownError

번호가 바뀐 코드

공통 기능(Base)

구 코드구 이름신규 코드신규 이름
80LANGUAGE_NOT_SET300LanguageNotSet
81EMPTY_TRANSLATED_STRING301EmptyTranslatedString
82NOT_FOUND_REQUIRED_INFORMATION302NotFoundRequiredInformation
83INVALID_GDS_INFO303InvalidGdsInfo
84NEED_STOVE_LAUNCHER304NeedStoveLauncher
85LAUNCHER_FAILED_CREATE_REQUIRED305LauncherFailedCreateRequired
86RENEW_TOKEN_MAX_RETRY_COUNT_EXCEEDED306RenewTokenMaxRetryCountExceeded
87IPC_CONNECT_FAILED307IpcConnectFailed
88IPC_AES_KEY_NOT_RECEIVED308IpcAesKeyNotReceived
89IPC_TIMEOUT309IpcTimeout
90CLOSE_ALL_POPUPS_FAILED68CloseAllPopupsFailed
91LOCAL_DB_CREATE_WORKING_DIRECTORY_FAILED40LocalDbCreateWorkingDirectoryFailed
92LOCAL_DB_CONNECT_FAILED41LocalDbConnectFailed
93LOCAL_DB_CREATE_TABLE_FAILED42LocalDbCreateTableFailed

결제(IAP)

구 코드구 이름신규 코드신규 이름
80VIEWUI_NOT_INITIALIZED60ViewUiNotInitialized
81VIEWUI_UNINIT_FAILED61ViewUiUninitFailed
82WEBVIEW_CREATE_FAIL62WebviewCreateFail
83WEBVIEW_LOAD_URL_FAIL63WebviewLoadUrlFail
84WEBVIEW_CLOSED_BEFORE_PURCHASE34WebviewClosedBeforeComplete
85PARAMETER_LENGTH_EXCEEDED80ParameterLengthExceeded
86INVALID_JSON_STRING81InvalidJsonString
87WEBVIEW_CREATE_COOKIE_FAIL64WebviewCreateCookieFail
88INVALID_ORDER_PRODUCT_INFORMATION503InvalidOrderProductInformation
89WEBVIEW_CLOSE_ALL_FAIL65WebviewCloseAllFail
90WEBVIEW_CLOSE_FAIL66WebviewCloseFail

팝업(View)

구 코드구 이름신규 코드신규 이름
80VIEWUI_NOT_INITIALIZED60ViewUiNotInitialized
81VIEWUI_UNINIT_FAILED61ViewUiUninitFailed
82WEBVIEW_CREATE_FAIL62WebviewCreateFail
83WEBVIEW_LOAD_URL_FAIL63WebviewLoadUrlFail
84WEBVIEW_CLOSE_ALL_FAIL65WebviewCloseAllFail
85WEBVIEW_CLOSE_FAIL66WebviewCloseFail
86WEBVIEW_CREATE_COOKIE_FAIL64WebviewCreateCookieFail
87NO_POPUP_DATA67NoPopupData

로그(Log)

구 코드구 이름신규 코드신규 이름
80LOCAL_DB_CREATE_WORKING_DIRECTORY_FAILED40LocalDbCreateWorkingDirectoryFailed
81LOCAL_DB_CONNECT_FAILED41LocalDbConnectFailed
82LOCAL_DB_CREATE_TABLE_FAILED42LocalDbCreateTableFailed
83LOCAL_DB_DISCONNECT_FAILED43LocalDbDisconnectFailed
86LOG_SIZE_EXCEEDED82PayloadSizeExceeded

신규 API에는 반영되지 않은 구 API 코드

구 코드구 이름안내
27LOG_81PLUG_ERROR내부 지표 전송용 코드예요. 신규 API에서는 제공하지 않아요
28UPDATE_81PLUG_FEED_ERROR내부 지표 전송용 코드예요. 신규 API에서는 제공하지 않아요
32AMPLITUDE_ERROR내부 지표 전송용 코드예요. 신규 API에서는 제공하지 않아요
250JSON_EXCEPTION내부 처리용 코드예요. 신규 API에서는 제공하지 않아요
84LOCAL_DB_BACKUP_LOG_FAILED로그 백업 실패 코드예요. 신규 API에는 짝이 되는 코드가 없어요
85INVALID_LOG_PARAMETER로그 파라미터 검증 코드예요. 신규 API에서는 5 InvalidParam 으로 전달돼요

결과 코드는 IsSuccessful() 로 성공 여부를 먼저 확인하고, 실패일 때만 코드를 확인하세요. 번호를 그대로 비교하던 코드가 있다면 위 표로 하나씩 대조해야 해요.