主頁(yè) > 服務(wù)與支持 > 開(kāi)發(fā)平臺(tái) > 客戶端SDK參考 > Windows UI SDK > 快速入門 快速入門
更新時(shí)間:2019-11-20
在開(kāi)發(fā)的過(guò)程中請(qǐng)滿足如下環(huán)境要求。
環(huán)境和工具名稱 |
版本要求 |
說(shuō)明 |
---|---|---|
操作系統(tǒng) |
Windows 10專業(yè)版 |
硬件要求:
|
Microsoft Visual Studio |
Visual Studio 2015 |
- |
會(huì)議云服務(wù)的用戶帳號(hào) |
- |
帳號(hào)可來(lái)源于華為公有云。開(kāi)通方法請(qǐng)參見(jiàn)“開(kāi)發(fā)前準(zhǔn)備”。 |
以下操作基于項(xiàng)目默認(rèn)配置Debug與默認(rèn)平臺(tái)Win32,更改配置和平臺(tái)時(shí)需要重新添加附加包含目錄和附加依賴庫(kù)。
#define DEMO_CUSTOM_BEGIN WM_USER #define CUSTOM_WM_BEGIN (DEMO_CUSTOM_BEGIN + 300) //初始化接口結(jié)果回調(diào)通知 #define WM_INIT_RESULT (CUSTOM_WM_BEGIN + 1) //登錄接口結(jié)果回調(diào)通知 #define WM_LOGIN_RESULT (CUSTOM_WM_BEGIN + 2) |
#include "Hello_World.h" #include "Hello_WorldDlg.h" #include "Message.h" |
/** * notify消息通知處理接口 */ void NotifyAndCallBackProc::getNotify(int notifyId, void* data) { //當(dāng)前沒(méi)有消息通知需要處理 } /** * 初始化結(jié)果回調(diào) */ void NotifyAndCallBackProc::initCallBack(plugin_call_back_result* ret, void* data) { CHello_WorldApp* app = (CHello_WorldApp*)AfxGetApp(); if (!app) { //窗口已經(jīng)關(guān)閉 return; } CHello_WorldDlg* logindlg = (CHello_WorldDlg*)(app->m_pMainWnd); ::PostMessage(logindlg->GetSafeHwnd(), WM_INIT_RESULT, (WPARAM)ret->code, (LPARAM)data); } /** * 登錄結(jié)果回調(diào) */ void NotifyAndCallBackProc::loginCallBack(plugin_call_back_result* ret, void* data) { CHello_WorldApp* app = (CHello_WorldApp*)AfxGetApp(); if (!app) { //窗口已經(jīng)關(guān)閉直接返回 return; } //獲取登錄窗口 CHello_WorldDlg* logindlg = (CHello_WorldDlg*)(app->m_pMainWnd); //傳遞窗口消息 ::PostMessage(logindlg->GetSafeHwnd(), WM_LOGIN_RESULT, (WPARAM)ret->code, (LPARAM)data); } |
#include "plugin_msg.h"
|
class NotifyAndCallBackProc { public: NotifyAndCallBackProc(); ~NotifyAndCallBackProc(); public: //通知消息回調(diào) static void getNotify(int notifyId, void* data); //初始化結(jié)果回調(diào) static void initCallBack(plugin_call_back_result* ret, void* data); //登錄結(jié)果回調(diào) static void loginCallBack(plugin_call_back_result* ret, void* data); }; |
上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加。
public: CString m_loginAccount;//賬號(hào)變量 CString m_loginPwd; //密碼變量 |
#include "NotifyAndCallBackProc.h" #include "plugin_interface.h" #include "Message.h" |
/** * 初始化接口 */ int CHello_WorldDlg::Init() { //組裝入?yún)⒔Y(jié)構(gòu)體 struct plugin_init_param initParam; memset(&initParam, 0, sizeof(plugin_init_param)); //設(shè)置消息通知回調(diào)接口 initParam.notifyFunc = NotifyAndCallBackProc::getNotify; //設(shè)置回調(diào)接口 initParam.callbackFunc = NotifyAndCallBackProc::initCallBack; initParam.path = "E:\\Hello_World\\debug\\"; initParam.appId = "demo"; //調(diào)用初始化接口 int ret = clm_init(&initParam); return ret; } |
/** * 初始化結(jié)果回調(diào) */ afx_msg LRESULT CHello_WorldDlg::initCallBack(WPARAM wParam, LPARAM lParam) { if (wParam != PLUGIN_STATUS_SUCCESS) { AfxMessageBox(_T("Init failed")); } else { //初始化成功后調(diào)用登錄接口 int ret = Login(); if (PLUGIN_STATUS_SUCCESS != ret) { AfxMessageBox(_T("login error")); } } return 0L; } |
/** * 登錄成功回調(diào)接口 */ afx_msg LRESULT CHello_WorldDlg::loginCallBack(WPARAM wParam, LPARAM lParam) { if (wParam != PLUGIN_STATUS_SUCCESS) { //提示登錄失敗 AfxMessageBox(_T("Login failed")); } else { //提示登錄成功 AfxMessageBox(_T("Login success")); } return 0L; } |
BEGIN_MESSAGE_MAP(CHello_WorldDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CHello_WorldDlg::OnBnClickedButton1) //綁定初始化結(jié)果回調(diào)消息 ON_MESSAGE(WM_INIT_RESULT, &CHello_WorldDlg::initCallBack) //綁定登錄結(jié)果回調(diào)消息 ON_MESSAGE(WM_LOGIN_RESULT, &CHello_WorldDlg::loginCallBack) END_MESSAGE_MAP() |
上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加
/** * 將UNICODE字符串轉(zhuǎn)成UTE-8格式 */ std::string CHello_WorldDlg::UNICODE2UTF(const CString& cstr) { char* pElementText; int iTextLen; std::wstring wstr = (LPCWSTR)CStringW(cstr);; //獲取字符串長(zhǎng)度 iTextLen = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); //長(zhǎng)度為0返回空 if (0 >= (iTextLen + 1)) { return ""; } //申請(qǐng)字符串長(zhǎng)度的內(nèi)存空間 pElementText = new char[iTextLen + 1]; memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1)); ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, pElementText, iTextLen, NULL, NULL); //將char數(shù)組轉(zhuǎn)為string std::string strText; strText = pElementText; //釋放內(nèi)存 delete[] pElementText; pElementText = NULL; return strText; } |
/** * 登錄邏輯接口 */ int CHello_WorldDlg::Login() { int ret; //獲取界面填入的信息 m_loginAccountEdit.GetWindowText(m_loginAccount); m_loginPwdEdit.GetWindowText(m_loginPwd); std::string account = UNICODE2UTF(m_loginAccount); std::string password = UNICODE2UTF(m_loginPwd); //組裝入?yún)⒔Y(jié)構(gòu)體 struct plugin_login_param loginParam; memset(&loginParam, 0, sizeof(plugin_login_param)); loginParam.account = (char*)account.c_str(); loginParam.password = (char*)password.c_str(); //設(shè)置回調(diào)接口 loginParam.callbackFunc = NotifyAndCallBackProc::loginCallBack; ret = clm_login(&loginParam); return ret; } |
void CHello_WorldDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 int ret = Init(); if (PLUGIN_STATUS_SUCCESS != ret) { AfxMessageBox(_T("Init error")); } } |
上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加。
/** * 退出接口 */ void CHello_WorldDlg::exit() { int ret = clm_exit_sync(); } |
#include <string>
|
public: //初始化接口 int Init(); //字符轉(zhuǎn)換接口 std::string UNICODE2UTF(const CString& cstr); //登錄邏輯接口 int Login(); //初始化結(jié)果回調(diào)消息 afx_msg LRESULT initCallBack(WPARAM wParam, LPARAM lParam); //登錄結(jié)果回調(diào)消息 afx_msg LRESULT loginCallBack(WPARAM wParam, LPARAM lParam); //退出接口 static void exit(); |
exit接口必須聲明為static接口。
BOOL CHello_WorldApp::InitInstance() { // 如果一個(gè)運(yùn)行在 Windows XP 上的應(yīng)用程序清單指定要 // 使用 ComCtl32.dll 版本 6 或更高版本來(lái)啟用可視化方式, //則需要 InitCommonControlsEx()。 否則,將無(wú)法創(chuàng)建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 將它設(shè)置為包括所有要在應(yīng)用程序中使用的 // 公共控件類。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // 創(chuàng)建 shell 管理器,以防對(duì)話框包含 // 任何 shell 樹(shù)視圖控件或 shell 列表視圖控件。 CShellManager *pShellManager = new CShellManager; // 激活“Windows Native”視覺(jué)管理器,以便在 MFC 控件中啟用主題 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); // 標(biāo)準(zhǔn)初始化 // 如果未使用這些功能并希望減小 // 最終可執(zhí)行文件的大小,則應(yīng)移除下列 // 不需要的特定初始化例程 // 更改用于存儲(chǔ)設(shè)置的注冊(cè)表項(xiàng) // TODO: 應(yīng)適當(dāng)修改該字符串, // 例如修改為公司或組織名 SetRegistryKey(_T("應(yīng)用程序向?qū)傻谋镜貞?yīng)用程序")); CHello_WorldDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置處理何時(shí)用 // “確定”來(lái)關(guān)閉對(duì)話框的代碼 // 窗口關(guān)閉時(shí)調(diào)用sdk退出接口 CHello_WorldDlg::exit(); } else if (nResponse == IDCANCEL) { // TODO: 在此放置處理何時(shí)用 // “取消”來(lái)關(guān)閉對(duì)話框的代碼 // 窗口關(guān)閉時(shí)調(diào)用sdk退出接口 CHello_WorldDlg::exit(); } else if (nResponse == -1) { TRACE(traceAppMsg, 0, "警告: 對(duì)話框創(chuàng)建失敗,應(yīng)用程序?qū)⒁馔饨K止。\n"); TRACE(traceAppMsg, 0, "警告: 如果您在對(duì)話框上使用 MFC 控件,則無(wú)法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n"); } // 刪除上面創(chuàng)建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; } #ifndef _AFXDLL ControlBarCleanUp(); #endif // 由于對(duì)話框已關(guān)閉,所以將返回 FALSE 以便退出應(yīng)用程序, // 而不是啟動(dòng)應(yīng)用程序的消息泵。 return FALSE; } |
上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加。
配置為Win32平臺(tái)時(shí),目錄地址為Hello_SDK\dll\win32,配置為x64平臺(tái)時(shí),目錄地址為Hello_SDK\dll\x64。