暖暖视频免费观**,国产免费美女被艹视频,毛片一级毛片,不卡三级

智慧服務(wù),成就美好體驗(yàn) 項(xiàng)目咨詢

主頁(yè) > 服務(wù)與支持 > 開(kāi)發(fā)平臺(tái) > 客戶端SDK參考 > Windows UI SDK > 快速入門 快速入門

入門使用

快速入門

更新時(shí)間:2019-11-20

開(kāi)發(fā)環(huán)境準(zhǔn)備

在開(kāi)發(fā)的過(guò)程中請(qǐng)滿足如下環(huán)境要求。

表1 環(huán)境要求

環(huán)境和工具名稱

版本要求

說(shuō)明

操作系統(tǒng)

Windows 10專業(yè)版

硬件要求:

  • CPU:i5-2400四核 3.1GHz及以上。
  • 內(nèi)存:4GB及以上。

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)備”。

SDK快速集成

  1. 解壓SDK開(kāi)發(fā)包內(nèi)容到本地。

     

    1. 在本地創(chuàng)建名為“Hello_SDK”的目錄。
    2. 將下載的SDK文件夾中的所有內(nèi)容拷貝到“Hello_SDK”目錄。
      圖1 拷貝SDK內(nèi)容到本地 

     

  2. 創(chuàng)建工程項(xiàng)目。

     

    1. 打開(kāi)Visual Studio 2015,單擊菜單欄的“文件> 新建> 項(xiàng)目”,打開(kāi)“新建項(xiàng)目”窗口。
      圖2 打開(kāi)新建項(xiàng)目 
    2. 在“新建項(xiàng)目”左側(cè)選擇“模板> Visual C++ > MFC”,然后在右側(cè)模板中選擇“MFC 應(yīng)用程序”,在“名稱”輸入工程名稱“Hello_World”,在“位置”選擇工程保存位置,此處選擇“E:\”,完成后點(diǎn)擊“確定”。
      圖3 新建項(xiàng)目 
    3. 在“MFC應(yīng)用程序向?qū)?rdquo;中單擊“下一步”,然后選擇“應(yīng)用程序類型”為“基于對(duì)話框”,其余設(shè)置均保持默認(rèn)值,點(diǎn)擊完成。
      圖4 MFC應(yīng)用程序向?qū)?/span> 

     

  3. 拷貝靜態(tài)庫(kù)文件與頭文件到項(xiàng)目中。

     

    1. 在“Hello_World”工程目錄下新建“SDK”目錄,與.sln文件同級(jí)。
      圖5 新建“SDK” 
    2. 將“Hello_SDK”目錄下的“lib”和“include”目錄拷貝到“SDK”目錄下。
      圖6 拷貝文件 

     

  4. 修改項(xiàng)目“配置屬性”。

     

    說(shuō)明: 

    以下操作基于項(xiàng)目默認(rèn)配置Debug與默認(rèn)平臺(tái)Win32,更改配置和平臺(tái)時(shí)需要重新添加附加包含目錄和附加依賴庫(kù)。

    1. 在“Hello_World”項(xiàng)目右鍵單擊“屬性”。
      圖7 項(xiàng)目屬性 
    2. 在屬性頁(yè)左側(cè)選擇“配置屬性 > C/C++ > 常規(guī)”,將“附加包含目錄”的值修改為“..\SDK\include”, 點(diǎn)擊“應(yīng)用”按鈕。
      圖8 配置“附加包含目錄” 
    3. 在屬性頁(yè)左側(cè)選擇“配置屬性 > 鏈接器> 常規(guī)”,將“附加庫(kù)目錄”的值修改為“..\SDK\lib\win32”, 點(diǎn)擊“應(yīng)用”按鈕。
      圖9 配置“附加庫(kù)目錄” 
    4. 在屬性頁(yè)左側(cè)選擇“配置屬性> 鏈接器> 輸入”,將“附加依賴項(xiàng)”的值修改為“CWSDK.lib”,點(diǎn)擊“應(yīng)用”。
      圖10 添加“附加依賴項(xiàng)” 
    5. 在屬性頁(yè)左側(cè)列表中選擇“配置屬性 > 常規(guī)”,“ 輸出目錄”值修改為“..\debug”,點(diǎn)擊“確定”按鈕。
      圖11 配置“輸出目錄” 

     

  5. 添加界面資源控件。

     

    1. 在“資源視圖 ”中,打開(kāi)工程對(duì)應(yīng)的Dialog頁(yè)面。
      圖12 工程Dialog頁(yè)面 
    2. 選中頁(yè)面上原有全部控件,按Delete鍵刪除。
      圖13 刪除原有控件 
    3. 添加登錄帳號(hào)控件和登錄帳號(hào)注釋控件。
      1. 添加登錄帳號(hào)控件:打開(kāi)“工具箱”頁(yè)面,直接選中“Edit Control”控件拖至右邊頁(yè)面上,調(diào)整寬度。
        圖14 添加登錄帳號(hào)控件 
      2. 添加登錄帳號(hào)注釋控件:打開(kāi)“工具箱”頁(yè)面,直接選中“Static Text”控件,拖至右邊頁(yè)面上。
        圖15 添加登錄帳號(hào)注釋控件 
      3. 修改登錄帳號(hào)注釋控件:選中登錄帳號(hào)注釋控件,右擊選擇“屬性”。
        圖16 打開(kāi)登錄帳號(hào)注釋控件屬性頁(yè) 
      4. 在對(duì)應(yīng)的屬性頁(yè)上,找到“Caption”項(xiàng),將值修改為“Account”。
        圖17 修改登錄帳號(hào)注釋 
    4. 添加登錄密碼控件和登錄密碼注釋控件,修改注釋為“Password”,其余操作同上一步。
      圖18 添加密碼控件 
    5. 添加登錄按鈕。
      1. 添加登錄按鈕控件:打開(kāi)“工具箱”頁(yè)面,選中“Button”控件,拖至右邊頁(yè)面上并調(diào)整寬度。
      圖19 添加登錄按鈕 
      1. 修改登錄按鈕上面的注釋:選中登錄按鈕,右擊選擇“屬性。
        圖20 打開(kāi)登錄按鈕屬性 
      2. 在對(duì)應(yīng)的屬性頁(yè)上,找到“Caption”項(xiàng),將值修改為“Login”。
        圖21 修改登錄按鈕屬性 

     

  6. 添加控件變量

     

    1. 為帳號(hào)控件添加變量。
      1. 選中帳號(hào)控件,右擊選擇 “添加變量”,打開(kāi)“添加成員變量向?qū)?rdquo;頁(yè)面。
        圖22 打開(kāi)添加變量 
      2. 在“添加成員變量向?qū)?rdquo;頁(yè)面填寫(xiě)“變量名”為“m_loginAccountEdit”,其它默認(rèn)設(shè)置保持不變,點(diǎn)擊完成。
        圖23 添加帳號(hào)控件變量 
    2. 添加密碼控件變量“m_loginPwdEdit”,操作同上一步。
      圖24 添加密碼控件變量 
    3. 調(diào)整Dialog頁(yè)面尺寸到合適位置,保存現(xiàn)有工程。
      圖25 調(diào)整頁(yè)面尺寸 

     

  7. 添加登錄按鈕點(diǎn)擊事件處理。

     

    1. 雙擊“Login”控件,系統(tǒng)會(huì)自動(dòng)在Hello_WorldDlg.cpp中添加登錄按鈕事件方法OnBnClickedButton1()。
      圖26 創(chuàng)建登錄按鈕事件方法 

     

  8. 添加代碼文件。

     

    1. 添加回調(diào)處理類。
      1. 選中項(xiàng)目右鍵“添加 > 類”。
        圖27 添加類 
      2. 在添加類頁(yè)面中選中“C++類”,點(diǎn)擊“添加”。
        圖28 添加“C++類” 
      3. 在“一般C++類向?qū)?rdquo;中填寫(xiě)類名“NotifyAndCallBackProc”,其他保持默認(rèn),點(diǎn)擊“完成”,保持現(xiàn)有工程。

    2. 添加公共消息定義頭文件。
      1. 選中“項(xiàng)目> 頭文件”右鍵點(diǎn)擊,選擇“添加> 新建項(xiàng)”。

      2. 在“添加新項(xiàng)”頁(yè)面左側(cè)選中“Visual C++”,然后在右側(cè)選中“頭文件(.h)”。在“名稱”中修改名稱為“Message.h”,點(diǎn)擊“添加”。

     

  9. 添加邏輯代碼。

     

    1. 在Message.h文件中增加登錄結(jié)果回調(diào)消息定義。
      #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)
      
       
    2. 在NotifyAndCallBackProc.cpp文件中包含相關(guān)頭文件。
      #include "Hello_World.h"
      #include "Hello_WorldDlg.h"
      #include "Message.h"
      
       
    3. 在NotifyAndCallBackProc.cpp文件中定義通知消息回調(diào)接口、初始化結(jié)果回調(diào)接口和登錄結(jié)果回調(diào)接口。
      /**
      * 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);
      }
      
       
    4. 在NotifyAndCallBackProc.h文件中包含相關(guān)頭文件。
      #include "plugin_msg.h"
      
       
    5. 在NotifyAndCallBackProc.h文件中聲明通知消息回調(diào)接口、初始化結(jié)果回調(diào)接口和登錄結(jié)果回調(diào)接口。
      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);
      };
      
       
      說(shuō)明: 

      上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加。

    6. 在Hello_WorldDlg.h文件中定義將要使用的變量。
      public:
              CString m_loginAccount;//賬號(hào)變量
      	CString m_loginPwd;    //密碼變量
      
       
    7. 在Hello_WorldDlg.cpp文件中包含用到的頭文件。
      #include "NotifyAndCallBackProc.h"
      #include "plugin_interface.h"
      #include "Message.h"
      
       
    8. 在Hello_WorldDlg.cpp文件中定義初始化接口。
      /**
      * 初始化接口
      */
      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;
      }
      
       
    9. 在Hello_WorldDlg.cpp文件中定義初始化結(jié)果回調(diào)接口。
      /**
      * 初始化結(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;
      }
      
       
    10. 在Hello_WorldDlg.cpp文件中定義登錄結(jié)果回調(diào)接口。
      /**
      * 登錄成功回調(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;
      }
      
       
    11. 在Hello_WorldDlg.cpp文件中綁定初始化結(jié)果和登錄結(jié)果回調(diào)消息。
      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()
      
       
      說(shuō)明: 

      上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加

    12. 在Hello_WorldDlg.cpp文件中定義字符串轉(zhuǎn)換接口。
      /**
      * 將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;
      }
      
       
    13. 在Hello_WorldDlg.cpp文件中定義登錄處理接口。
      /**
      * 登錄邏輯接口
      */
      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;
      }
      
       
    14. 在Hello_WorldDlg.cpp文件中實(shí)現(xiàn)登錄按鈕點(diǎn)擊事件處理。
      void CHello_WorldDlg::OnBnClickedButton1()
      {
      	// TODO: 在此添加控件通知處理程序代碼
      	int ret = Init();
      	if (PLUGIN_STATUS_SUCCESS != ret)
      	{
      		AfxMessageBox(_T("Init error"));
      	}
      }
      
       
      說(shuō)明: 

      上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加。

    15. 在Hello_WorldDlg.cpp定義退出接口
      /**
      * 退出接口
      */
      void CHello_WorldDlg::exit()
      {
      	int ret = clm_exit_sync();
      }
      
       
    16. 在Hello_WorldDlg.h文件中包含頭文件
      #include <string>
      
       
    17. 在Hello_WorldDlg.h文件中添加上述所有新增接口聲明。
      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();
      
       
      說(shuō)明: 

      exit接口必須聲明為static接口。

    18. 在Hello_World.cpp文件中找到InitInstance接口,在窗口退出時(shí)調(diào)用exit接口。
      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;
      }
      
       
      說(shuō)明: 

      上文代碼部分與工程代碼重復(fù),注意區(qū)分,不要重復(fù)添加。

     

  10. 編譯及調(diào)試工程。

     

    1. 選中工程,右鍵選擇“重新生成”,進(jìn)行編譯。
      圖29 生成文件 
    2. 觀察“Output”窗口,出現(xiàn)信息“全部重新生成: 成功 1 個(gè),失敗 0 個(gè),跳過(guò) 0 個(gè)”,代表編譯成功。
      圖30 生成結(jié)果 
    3. 編譯成功后,生成的可執(zhí)行程序Hello_World.exe在輸出目錄下,當(dāng)前輸出目錄路徑為${path}\Hello_World\debug。
      圖31 exe文件 
    4. 拷貝“Hello_SDK\dll”目錄下對(duì)應(yīng)平臺(tái)的.dll文件到輸出目錄。
      圖32 拷貝dll庫(kù) 
      說(shuō)明: 

      配置為Win32平臺(tái)時(shí),目錄地址為Hello_SDK\dll\win32,配置為x64平臺(tái)時(shí),目錄地址為Hello_SDK\dll\x64。

    5. 拷貝“Hello_SDK”目錄下的“HuaweiMeeting”目錄到輸出目錄。
      圖33 拷貝HuaweiMeeting 
    6. 雙擊Hello_World.exe文件,啟動(dòng)登錄界面。
      圖34 登錄頁(yè)面 
    7. 輸入登錄信息,點(diǎn)擊“Login”按鈕登錄,登錄成功會(huì)有“Login success”提示。
      圖35 登錄成功提示