# GUNION SDK 开发手册 For PC

# 1、前言

为了使接入方更方便统一接入,现在提供三端统一接口关于静密登录、短信登录和三方登录相关等接口。

# 2、SDK接入流程概述

  • 搭建SDK开发环境,链接相关静态库库(32位sdologinsdk.lib)或者(64位sdologinsdk64.lib)以及调用头文件相关接口进行登录器初始化(GhomeInitialize)拉取登录器进程sdologin.exe
  • 设置sdologin.exe进程的父窗口(GhomeSetOwnerWindow)以及sdologin.exe启动模式(GhomeSetLoginMode)。(重要)
  • 完成隐私政策展示逻辑,调用提供的隐私协议接口(GhomeDoPrivacyAgreement)。
  • 初始化SDK,调用相关SDK初始化接口(GhomeDoInit)为了得到后续相关参数。
  • 初始化成功,调用账号功能显示登录框界面相关接口(GhomeShowLoginDialog)。
  • 其他功能接口,可根据业务需要适时调用。
  • 销毁SDK,游戏退出时候调用销毁SDKGHomeTerminal)。
  • 游戏在启动游戏时最好需对设备网络进行判断,若无网络的情况下,游戏需实现对用户的弹框提示。(也可以让登录器这边提供弹窗,取决于调用方如何设定)
接口 功能 备注
GhomeInitialize 初始化登录器并拉取登录器sdologin进程 游戏初始化之后调用这个接口拉取登录器sdologin.exe
GhomeDoPrivacyAgreement 隐私协议展示功能 根据GhomeInitialize调用是否拉取sdologin.exe决定展示隐私协议
GhomeDoInit 后续参数初始化接口得到相关参数 为了获取后续相关接口的参数。调用GhomeDoPrivacyAgreement隐私协议同意之后才调用这个接口
GHomeTerminal 销毁SDK 游戏退出之后调用这个接口销毁SDK
GhomeSetOwnerWindow 设置登录器界面父窗口 游戏调用GhomeInitialize成功之后才可以要调用这个接口把游戏窗口设置为登录器界面的父窗口
GhomeSetLoginMode 设置LoginMode(用于区分是Launcher还是游戏启动了登录器) 调用这个接口区分是Launcher启动登录器和游戏启动登录器
GhomeShowLoginDialog 显示登录框界面(切换账号) 游戏调用初始化GhomeDoInit成功之后调这个接口显示登录界面
GhomeMoveLoginDialog 移动登陆窗口到指定位置 可以调这个接口移动登录界面到指定位置
GhomeLogout 登出接口(删除自动登录票据) 游戏退出当前已经登录的账号
GhomeGetTicket 获取一次性票据接口 用户登录成功之后调用这个接口可以获取一次性票据
GhomeSetLoginArea 设置用户区服信息 游戏登录成功之后调用这个接口上报用户区服信息
GhomeGetLoinAreaList 获取商户设置的区服信息 调用这个接口可以获取到商户设置的区服信息

另外如果接入方使用自己的引擎的话可以调用:

接口 功能 备注
OnGetSharedImage 获取到共享内存纹理数据图片 接入方使用自己的引擎调用这个接口可以获取到登录器这边绘制的纹理界面
OnGameProc 传入自己这边接入的引擎收到的消息并调用这个接口转发给登录器 如果是登录器这边处理的消息使用这个接口传入即可

例如,我这边使用direct3d引擎接入的话:

  • 调用OnGetSharedImage获取共享内存图片渲染的纹理的位图:

    void IGRenderDX9::UpdateAllTextures()
    {
    	TRACET();
    	if(m_TextureMap.size() < 1)
    	{
    		return;
    	}
    
    	ClearInvalidTexture();
    
    	if(IGWindowManager::GetInstance()->LockWrite())
    	{
    		const IGWindowList& windowList = IGWindowManager::GetInstance()->GetWindowList();
    		for(IGWindowList::const_iterator it = windowList.begin(); it != windowList.end(); ++it)
    		{
    			IGWindow* pWindow = *it;
    			if(pWindow->GetTexture() == 0)
    			{
    				TRACEW(_T("IGRDX9 No texture."));
    				continue;
    			}
    
    			Texture* pTexture = GetTexture(pWindow->GetTexture());
    			if(pTexture == NULL)
    			{
    				TRACEW(_T("IGRDX9 GetTexture failed."));
    				continue;
    			}
    
    			if(pWindow->HasUpdate())
    			{
    				pWindow->BeginUpdate();
    				
    				if(UpdateTexture(pWindow->GetTexture(), ModuleLoginSDK::GetInstance()->OnGetSharedImage()->Bitmap))
    				{
    					pWindow->EndUpdate();
    				}
    				pWindow->CancelUpdate();
    			}
    
    		}
    		IGWindowManager::GetInstance()->UnlockWrite();
    	}
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    • 调用OnGameProc处理登录器的消息:
    LRESULT DirectX3dDlg::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext)
    {
    	if (CLauncher::GetInstance()->GetSDOADx9())
    	{	// 把消息交给IGW模块处理 
    		LRESULT lResult;
    		if (CLauncher::GetInstance()->GetSDOADx9()->OnWindowProc(hWnd, uMsg, wParam, lParam, &lResult) == SDOA_OK)
    		{
    			*pbNoFurtherProcessing = true;// 不让自身再处理消息 
    			return lResult;
    		}
    	}
    
    	if (uMsg == WM_KEYDOWN && wParam == 'F') {
    		DXUTToggleFullScreen();
    	};
    
    	if (uMsg == WM_TIMER) {
    
    	};
    
    	// Always allow dialog resource manager calls to handle global messages
    	// so GUI state is updated correctly
    	DirectX3dDlg* directX3dDlg = (DirectX3dDlg*)pUserContext;
    	*pbNoFurtherProcessing = directX3dDlg->m_DialogResourceManager.MsgProc(hWnd, uMsg, wParam, lParam);
    	if (*pbNoFurtherProcessing)
    		return 0;
    
    	*pbNoFurtherProcessing = directX3dDlg->m_LoginDialog.MsgProc(hWnd, uMsg, wParam, lParam);
    	if (*pbNoFurtherProcessing)
    		return 0;
    
    	*pbNoFurtherProcessing = directX3dDlg->m_LogDialog.MsgProc(hWnd, uMsg, wParam, lParam);
    	if (*pbNoFurtherProcessing)
    		return 0;
    
    	return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37

# 3、登录方式

  • 目前支持官方短信登录和密码登录。如果有需要可以后续提供扫码登录等。
  • 目前支持三方登录:微信、QQ、微博。

# 4、开发环境要求

目前提供一个导出的C风格的头文件,游戏接入方需要以管理员方式设置游戏的启动,并通过链接相关库然后通过这个头文件调用相关接口,使用C++相关工程接入。**目前接入方要使用自己的图形引擎展示界面UI,这边也可以提供接口(绘制好的图形UI接口以及消息传递接口)把绘制好的图形UI给接入方,接入方根据这个图形调用渲染引擎展示出来即可。 ** (另外如果有需要的话可以提供接入demo)

#ifndef SDO_GHOME_H
#define SDO_GHOME_H

#ifndef SDOAPI
#define SDOAPI __stdcall
#endif

#include <windows.h>
#include <ObjBase.h>

#ifdef __cplusplus
extern "C" {
#endif

#pragma pack(push,1)

#define SDOL_ERRORCODE_OK					0      // 成功
#define SDOL_ERRORCODE_FAILED				-1     // 失败
#define SDOL_ERRORCODE_UNEXCEPT				-100   // 未知异常
#define SDOL_ERRORCODE_LOGINCANCEL			-101   // 用户按取消关闭了登录对话框
#define SDOL_ERRORCODE_INVALIDPARAM			-102   // 参数无效
#define SDOL_ERRORCODE_INVALIDBUFFER		-103   // 缓冲区大小不足
#define SDOL_ERRORCODE_GETTICKET_TIMEOUT	-104   // GetTicket超时
#define SDOL_ERRORCODE_NOT_SUPPORT          -105   // 不支持该操作

#define NormalLoginMode              0
#define LauncherLoginMode            1
#define AttachToLoginMode            2

#define UPDATE_ACTION_DOWNLOAD       1
#define UPDATE_ACTION_SETUP          2

	// Data structures
	struct GhomeLAppInfo{
		DWORD Size;			// = sizeof(GhomeLAppInfo)
		int AppID;			// 盛大统一游戏ID
		LPCWSTR AppName;	// 游戏名称
		LPCWSTR AppVer;		// 游戏版本
		int AreaId;			// 游戏区ID	(注意:不可用时传-1)
		int GroupId;		// 游戏组ID	(注意:不可用时传-1)
	};

	struct GhomeLLoginResult{
		DWORD Size;				// sizeof(GhomeLLoginResult),为以后扩充提供可能
		LPCWSTR SessionId;		// ticket
		LPCWSTR Sndaid;			// 用户ID
		LPCWSTR IdentityState;
		LPCWSTR Appendix;
	};

	struct GhomeShareImageOut 
	{
		int Version;
		int Sequence;
		BITMAP Bitmap;
		BYTE Data[1];  

		inline static size_t CalcSize(const BITMAP* pBitmap) {
			return sizeof(GhomeShareImageOut) + CalcImageSize(pBitmap);
		}
		inline static size_t CalcImageSize(const BITMAP* pBitmap) {
			return pBitmap->bmHeight * pBitmap->bmWidthBytes;
		}
		inline size_t GetSize()const {
			return CalcSize(&Bitmap);
		}
		inline size_t GetDataSize()const {
			return CalcImageSize(&Bitmap);
		}
	};

	struct GhomeSDOLLoginResult
	{
		DWORD       Size;			// sizeof(SDOLLoginResult),为以后扩充提供可能
		LPCWSTR     SessionId;		// 用于后台验证的token串
		LPCWSTR     Sndaid;		    // 用户ID
		LPCWSTR     IdentityState;	// 是否成年标识,0未成年,1成年
		LPCWSTR     Appendix;		// 附加字段,保留
	};

	struct GhomeLoginAreaMsg{
		LPCWSTR    Userid;          // 用户ID
		LPCWSTR    Area;            //区
		LPCWSTR    Group;           //服
	};
	
	// 登录回调函数
	// 返回 SDOL_LOGINRESULT_KEEP_SHOWN 登录窗口继续显示,返回 SDOL_LOGINRESULT_CLOSE 关闭登录窗口
	// nErrorCode:     登录返回错误代码
	// pLoginResult:   登录返回结果,返回成功时才有效
	// nUserData:      在调用ShowLoginDialog时传入的用户数据
	// nReserved:      保留,暂不使用,目前总是为0(不等于ShowLoginDialog中传入的Reserved参数)
	//typedef int (SDOAPI *LPSDOLLOGINCALLBACKPROC)(int nErrorCode, const GhomeSDOLLoginResult* pLoginResult, int nUserData, int nReserved);

	// 调用sdk的隐私协议展示功能回调函数
	// nErrorCode:     返回错误代码,
	// message    :     授权码验证返回的信息
	typedef BOOL (SDOAPI *LPPRIVATEAGREEMENTCALLBACKPROC)(int nErrorCode,const char* call_condition);
	//调用sdk的初始化
	// nErrorCode:     返回错误代码,
	// message    :     授权码验证返回的信息
	typedef BOOL (SDOAPI *LPGINITCALLBACKPROC)(int nErrorCode);
	//调用sdk的获取商户设置的区服列表
	// nErrorCode:     返回错误代码,
	// message    :     授权码验证返回的信息
	typedef BOOL (SDOAPI *LPGGETLOGINAREALISTCALLBACKPROC)(int nErrorCode,const char* json_msg);

	// Function declarations
	int SDOAPI GhomeSetOwnerWindow(HWND hWnd);
	int SDOAPI GhomeShowLoginDialog(LPSDOLLOGINCALLBACKPROC fnCallback,int nUserData, int nReserved);
	int SDOAPI GhomeCloseLoginDialog(void);
	int SDOAPI GhomeMoveLoginDialog(int x, int y);
	int SDOAPI GhomeLogout(void);
	int SDOAPI DoLogin(void);
	int SDOAPI GhomeSetLoginMode(int nLoginMode);
	int SDOAPI GhomeGetTicket(BSTR* bstrTicket);
	//int SDOAPI ModifyAppInfo(const GhomeLAppInfo* pAppInfo);
	int SDOAPI GhomeOpenWindow(LPCWSTR pwcsWinType, LPCWSTR pwcsWinName, LPCWSTR pwcsSrc, int nLeft, int nTop, int nWidth, int nHeight, LPCWSTR pwcsMode);
	int SDOAPI GetLoginedCompanyId(void);
	/** 设置登录窗状态
	@param [in] nState	1 显示; 2 隐藏
    @return 0表示成功  其他值表示失败
    */
	int SDOAPI GhomeSetLoginDialogState(int nState);
	/** 设置渠道参数
	@param [in] szGameClientType 渠道
    @return 0表示成功  其他值表示失败
    */
	int SDOAPI SetGameClientType(LPCWSTR szGameClientType);
	//游戏内打开活动窗口界面
	int SDOAPI OpenActivityWindow(LPCWSTR pwcsWinType, LPCWSTR pwcsWinName, LPCWSTR pwcsSrc, int nLeft, int nTop, int nWidth, int nHeight, LPCWSTR pwcsMode);
	/* 传入并转发消息 */
	HRESULT SDOAPI OnGameProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* lResult);
	//获取到共享内存数据图片
	GhomeShareImageOut* SDOAPI OnGetSharedImage(void);

	//Ghome调用sdk的隐私协议展示功能
	int SDOAPI GhomeDoPrivacyAgreement(const char* appId,LPPRIVATEAGREEMENTCALLBACKPROC fnCallback);
	//初始化初始化接口
	int SDOAPI GhomeInitialize(const GhomeLAppInfo* pAppInfo);
	//Ghome调用sdk的初始化接口
	int SDOAPI GhomeDoInit(const char* appId,LPGINITCALLBACKPROC fnCallback);
	//销毁接口
	int SDOAPI GHomeTerminal();
	
	//用户登录设置区服信息
	int SDOAPI GhomeSetLoginArea(const GhomeLoginAreaMsg* loginArea);
	//用户获取区服信息
	int SDOAPI GhomeGetLoinAreaList(LPGGETLOGINAREALISTCALLBACKPROC fnCallback);
	#pragma pack(pop)
#ifdef __cplusplus
}
#endif


#endif // SDO_GHOME_H

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

# 5、相关登录器接口的调用详细介绍

# 5.1、GhomeInitialize

说明:

  • 初始化登录器并拉取登录器sdologin.exe进程接口。
int SDOAPI GhomeInitialize(const GhomeLAppInfo* pAppInfo);
1

参数列表:

名称 类型 参数方式 说明
pAppInfo GhomeLAppInfo [IN] 初始化登录器并拉取登录器sdologin.exe进程接口。

参数类型说明:

  • // Data structures
    struct GhomeLAppInfo{
    		DWORD Size;			// = sizeof(GhomeLAppInfo)
    		int AppID;			// 盛大统一游戏ID
    		LPCWSTR AppName;	// 游戏名称
    		LPCWSTR AppVer;		// 游戏版本
    		int AreaId;			// 游戏区ID	(注意:不可用时传-1)
    		int GroupId;		// 游戏组ID	(注意:不可用时传-1)
    };
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

{		
    GhomeLAppInfo appinfo;    //创建参数信息
	appinfo.Size = sizeof(SDOLAppInfo);
	appinfo.AppID = 791000008;
	appinfo.AppName = L"";
	appinfo.AppVer = L"";
	appinfo.AreaId = 0;
	appinfo.GroupId = 0;

	int init_flag=GhomeInitialize(&appinfo);
}
1
2
3
4
5
6
7
8
9
10
11

# 5.2、GhomeDoPrivacyAgreement

说明:

  • 隐私协议展示功能。
int SDOAPI GhomeDoPrivacyAgreement(const char* appId,LPPRIVATEAGREEMENTCALLBACKPROC fnCallback);
1

参数列表:

名称 类型 参数方式 说明
appId const char* [IN] 初始化登录器并拉取登录器sdologin.exe进程接口。
fnCallback LPPRIVATEAGREEMENTCALLBACKPROC [IN] 隐私协议同意或者拒绝的回调函数

参数类型说明:

  • 回调函数说明:
// 调用sdk的隐私协议展示功能回调函数
// nErrorCode:     返回错误代码,
// call_condition  主动调用隐私协议还是被动 initiative:主动调用 passive:被动调用
// 回调函数返回值:整型,     1表示同意隐私协议,0表示拒绝隐私协议
typedef BOOL (SDOAPI *LPPRIVATEAGREEMENTCALLBACKPROC)(int nErrorCode,const char* call_condition);
1
2
3
4
5
  • 注意回调函数中的nErrorCode返回值为1为同意隐私协议,拒绝返回值为0
    • 隐私协议如果拒绝的话调用方这边最好有退出游戏之类的操作或者其他操作。
    • 根据typedef BOOL (SDOAPI *LPPRIVATEAGREEMENTCALLBACKPROC)(int nErrorCode);中的nErrorCode返回值为1的同意则进行后续操作,拒绝的并且call_condition返回值为initiative则退出游戏或者其他操作,见如下示例。

返回值:

  • 函数结果变量,成功会返回0,其他情况则表示失败。

调用示例:

BOOL CALLBACK CLauncher::OnDoPrivateCallBack(int nErrorCode,const char* call_condition)
{
	if (nErrorCode == 1)
	{
		TRACEE(L"OnDoPrivateCallBack 同意. \n");
		//MessageBoxA(NULL, "成功", "OnDoPrivateCallBack", MB_OK);

		if (private_flag == 0)
		{
			private_flag = private_flag + 1;
			CLauncher::GetInstance()->DoInit();
		}

		return 0;
	}
	else if (nErrorCode == 0)
	{
		TRACEE(L"OnDoPrivateCallBack 拒绝. \n");
		//passive主动关闭
		if (strcmp(call_condition, "initiative")==0)
		{
#ifdef _WIN64
			const TCHAR* targetProcessName = _T("SteamLogon64.exe");
#else
			const TCHAR* targetProcessName = _T("SteamLogon.exe");
#endif
			DWORD targetProcessID = GetProcessIDByName(targetProcessName);
			if (targetProcessID != 0)
			{
				if (KillProcessByPID(targetProcessID))
				{
					TRACEE("Succeed to terminate process :wkeplugin.exe");
				}
				else
				{
					TRACEE("Failed to terminate process :wkeplugin.exe");
				}
			}
			else
			{
				TRACEE("Process not found: :wkeplugin.exe");
			}
		}
		//MessageBoxA(NULL, "拒绝", "OnDoPrivateCallBack", MB_OK);
		return 0;
	}
	else
	{
		TRACEE(L"OnDoPrivateCallBack failed. \n");
		//MessageBoxA(NULL, "失败", "OnDoPrivateCallBack", MB_OK);
		return 0;
	}
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# 5.3、GhomeDoInit

说明:

  • 后续接口得到相关参数的初始化接口。根据回调函数返回的错误码看是否成功,成功的话则进行后续接口调用。
    • 注意:必须是GhomeDoPrivacyAgreement隐私协议接口调用同意之后才能调用此接口。
//Ghome调用sdk的初始化接口
int SDOAPI GhomeDoInit(const char* appId,LPGINITCALLBACKPROC fnCallback);
1
2

参数列表:

名称 类型 参数方式 说明
appId const char* [IN] 初始化登录器并拉取登录器sdologin.exe进程接口。
fnCallback fnCallbackLPGINITCALLBACKPROC [IN] 初始化得到相关参数的回调函数

参数类型说明:

  • 回调函数说明:
//调用sdk的初始化
// nErrorCode:     返回错误代码,
// 返回值:整型,0表示初始化成功,其他则失败
typedef BOOL (SDOAPI *LPGINITCALLBACKPROC)(int nErrorCode);
1
2
3
4

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

BOOL CALLBACK OnDoInitCallBack(int nErrorCode) 
{
	if(nErrorCode==0)
	{
		Trace(L"OnDoInitCallBack successed. \n");
		return 0;
	}
	else
	{
		Trace(L"OnDoInitCallBack failed. \n");
		//MessageBoxA(NULL, "失败", "OnDoInitCallBack", MB_OK);
		return 0;
	}
	return 0;
}

void DoInit()
{
	int do_init_flag=GhomeDoInit("791000008",OnDoInitCallBack);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 注意:为了进行后续接口的调用,这个接口的调用必须成功才可以调用后续接口。

# 5.4、GHomeTerminal

说明:

  • SDK相关资源的销毁,游戏进程退出时候调用。
//销毁接口
int SDOAPI GHomeTerminal();
1
2

参数列表:

参数类型说明:

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

  • 游戏进程退出后直接调用即可。

# 5.5、GhomeSetOwnerWindow

说明:

  • 设置父窗口,设置游戏窗口为登录器界面的父窗口。需要再GhomeInitialize成功之后就可以调用设置父窗口。
    • 把游戏界面窗口设置为登录器sdologin.exe进程的父窗口。
int SDOAPI GhomeSetOwnerWindow(HWND hWnd);
1

参数列表:

名称 类型 参数方式 说明
hWnd HWND [IN] 窗口句柄

参数类型说明:

  • HWND:窗口句柄。

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

void DoSetGameWnd()
{
	HWND hMainWin = DXUTGetHWND();
	::SendMessage(hMainWin, WM_ACTIVATEAPP, 0, 0);
	int a=GhomeSetOwnerWindow(hMainWin);
}
1
2
3
4
5
6

# 5.6、GhomeShowLoginDialog

说明:

  • 显示登录界面,调用GhomeDoInit成功之后并且设置了父窗口以及启动模式才可以调用这个接口显示登录界面。
int SDOAPI GhomeShowLoginDialog(LPSDOLLOGINCALLBACKPROC fnCallback,int nUserData, int nReserved);
1

参数列表:

名称 类型 参数方式 说明
fnCallback LPSDOLLOGINCALLBACKPROC [IN] 获取登录态状态回调函数
nUserData int [IN] 预留,传0
nReserved int [IN] 预留,传0

参数类型说明:

// 登录回调函数
// 返回 SDOL_LOGINRESULT_KEEP_SHOWN 登录窗口继续显示,返回 SDOL_LOGINRESULT_CLOSE 关闭登录窗口
// nErrorCode:     登录返回错误代码
// pLoginResult:   登录返回结果,返回成功时才有效
// nUserData:      在调用ShowLoginDialog时传入的用户数据
// nReserved:      保留,暂不使用,目前总是为0(不等于ShowLoginDialog中传入的Reserved参数)
typedef int (CALLBACK *LPSDOLLOGINCALLBACKPROC)(int nErrorCode, const SDOLLoginResult* pLoginResult, int nUserData, int nReserved);
1
2
3
4
5
6
7

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

/* 登录回调函数 */
int CALLBACK OnLogin(int nErrorCode, const SDOLLoginResult* pLoginResult, int nUserData, int nReserved) 
{ 
	//SDOLLoginResult loginResult;

	if (SDOL_ERRORCODE_OK == nErrorCode) 
	{ 
		Trace(L"Login success. SessionId[%s] Appmid[%s] IdentityState[%s] Appendix[%s]\n", pLoginResult->SessionId, pLoginResult->Sndaid, pLoginResult->IdentityState, pLoginResult->Appendix);
		::MessageBox(0, L"登录成功", L"提示", MB_OK);
	} 
	else if (SDOL_ERRORCODE_LOGINCANCEL == nErrorCode)
	{
		::MessageBox(0, L"登录失败", L"提示", MB_OK);
	}
	return 1; //关闭登录窗口
} 

/* 显示SDOLogin登录窗口 */
void ShowLoginDialog()
{
	HWND hMainWin = DXUTGetHWND();
	::SendMessage(hMainWin, WM_ACTIVATEAPP, 0, 0);
	GhomeSetOwnerWindow(hMainWin);
	int ret=GhomeShowLoginDialog(OnLogin, 0, 0);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 5.7、GhomeSetLoginMode

说明:

  • 设置LoginMode(用于区分是Launcher还是游戏启动了登录器)。填1,表示launcher启动。游戏启动则填0。在调用GhomeShowLoginDialog之前调用即可。

参数列表:

名称 类型 参数方式 说明
nLoginMode int [IN] 登录器启动模式。

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

  • 直接调用即可。

# 5.8、GhomeLogout

说明:

  • 用户登出账号,删除自动登录票据。
int SDOAPI GhomeLogout(void);
1

参数列表:

参数类型说明:

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

void DoLogout()
{
	int ret=GhomeLogout();

	if(ret==0)
	{
		Trace(L"GhomeLogout 成功. \n");
	}
	else
	{
		Trace(L"GhomeLogout 失败. \n");
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5.9、GhomeGetTicket

说明:

  • 获取一次性票据。
int SDOAPI GhomeGetTicket(BSTR* bstrTicket);
1

参数列表:

名称 类型 参数方式 说明
bstrTicket BSTR* [OUT] 出参得到的一次性票据

参数类型说明:

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

  • 注意:如果获取的票据为空尽量给个提示用户未登录或者用户已经注销之类的提示。
void DoGetTicket()
{
	BSTR bstrTicket = NULL;
	BSTR bstrSndaid = NULL;
	int a=GhomeGetTicket(&bstrTicket);
	int len = SysStringLen(bstrTicket); // 获取BSTR的长度

	if(a==0&&len>0)
	{
		MessageBox(NULL, bstrTicket, L"Ticket", MB_OK);
	}
	else
	{
		MessageBoxA(NULL,"用户未登录","GhomeGetTicket",0);
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 5.10、GhomeSetLoginArea

说明:

  • 设置用户的区服信息。
//用户设置区服信息
int SDOAPI GhomeSetLoginArea(const GhomeLoginAreaMsg* loginArea);
1
2

参数列表:

名称 类型 参数方式 说明
loginArea GhomeLoginAreaMsg [IN] 用户区服信息

参数类型说明:

struct GhomeLoginAreaMsg{
		LPCWSTR    Userid;          // 用户ID
		LPCWSTR    Area;            //区
		LPCWSTR    Group;           //服
};
1
2
3
4
5

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

void DoSetLoginArea()
{
	LPCWSTR w_user_id = g_editbox1->GetText();
	char sz_user_id[128] = "";
	wcstombs(sz_user_id, w_user_id, 127);

	LPCWSTR w_area = g_editbox2->GetText();
	char sz_area[128] = "";
	wcstombs(sz_area, w_area, 127);

	LPCWSTR w_group = g_editbox3->GetText();
	char sz_group[128] = "";
	wcstombs(sz_group, w_group, 127);
	
	GhomeLoginAreaMsg msg;
	msg.Userid=w_user_id;
	msg.Area=w_area;
	msg.Group=w_group;

	int a=GhomeSetLoginArea(&msg);
	if(a==0)
	{
		//MessageBoxA(NULL,"成功设置区服信息","提示",0);
	}else
	{
		//MessageBoxA(NULL,"失败设置区服信息","提示",0);
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 5.11、GhomeGetLoinAreaList

说明:

  • 获取商户设置过的区服列表信息。
//用户获取区服信息
int SDOAPI GhomeGetLoinAreaList(LPGGETLOGINAREALISTCALLBACKPROC fnCallback);
1
2

参数列表:

名称 类型 参数方式 说明
fnCallback LPGGETLOGINAREALISTCALLBACKPROC [IN] 回调函数得到设置用户信息是否成功

参数类型说明:

//调用sdk的获取商户设置的区服列表
// nErrorCode:     返回错误代码,
// json_msg    :     返回商户设置的区服信息,这个返回的是一个json格式的字符串。
typedef BOOL (SDOAPI *LPGGETLOGINAREALISTCALLBACKPROC)(int nErrorCode,const char* json_msg);
1
2
3
4

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

BOOL CALLBACK OnDoGetLoginAreaListCallBack(int nErrorCode,const char* json_msg) 
{
	if(nErrorCode==0)
	{
		MessageBoxA(NULL,json_msg,"OnDoGetLoginAreaListCallBack成功",0);
	}else
	{
		MessageBoxA(NULL,json_msg,"OnDoGetLoginAreaListCallBack失败",0);
	}
	return 0;
}
void DoGetLoginArea()
{
	int a=GhomeGetLoinAreaList(OnDoGetLoginAreaListCallBack);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 5.12、GhomeOpenWindow

说明:

  • 嵌入窗口的形式打开一个url界面。
int SDOAPI GhomeOpenWindow(LPCWSTR pwcsWinType, LPCWSTR pwcsWinName, LPCWSTR pwcsSrc, int nLeft, int nTop, int nWidth, int nHeight, LPCWSTR pwcsMode);
1

参数列表:

名称 类型 参数方式 说明
pwcsWinType LPCWSTR [IN] 窗口类型
pwcsWinName LPCWSTR [IN] 窗口名称
pwcsSrc LPCWSTR [IN] 需要打开的连接地址
nLeft int [IN] x坐标
nTop int [IN] y坐标
nWidth int [IN] 窗口的宽度
nHeight int [IN] 窗口的高度
pwcsMode LPCWSTR [IN] 窗口模式 center(居中)、fullscreen(全屏)、showmodal(模态框)、 BROWSER(浏览器打开)

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

void OpenWindow(LPCWSTR pwcsWinType, LPCWSTR pwcsWinName, LPCWSTR pwcsSrc, int nLeft, int nTop, int nWidth, int nHeight, LPCWSTR pwcsMode)
{
	int code = GhomeOpenWindow(pwcsWinType,pwcsWinName,pwcsSrc,nLeft,nTop,nWidth,nHeight,pwcsMode);
	Trace(L"ISDOLLoginEx::OpenWindow result[%d]\n", code);
}
1
2
3
4
5

# 5.13、GhomeMoveLoginDialog

说明:

  • 移动登陆窗口到指定位置。
int SDOAPI GhomeMoveLoginDialog(int x, int y);
1

参数列表:

名称 类型 参数 说明
x int [IN] 相对于owner window(父窗口)的x坐标
y int [IN] 相对于owner window(父窗口)的y坐标

返回值:

  • 结果变量,成功会返回0,其他情况则表示失败。

调用示例:

  • 直接传入坐标调用即可。
Last Updated: 9/18/2024, 7:29:27 AM