开放平台

    云会议PC客户端SDK 使用说明

    最后更新于:2017-04-25

    1. 概述

    PC客户端SDK是在PC(Windows)平台上,以二进制库(DLL)的形式提供的云会议软件开 发包。PC客户端SDK需要与客户自己的客户端应用编译、构建、打包成一个安装包,并最终安 装、运行为一个完整的应用程序。

    通过PC客户端SDK及所提供的简单的几个接口调用,只需很少的开发工作量,带着完整会议 功能和UI交互界面的云会议客户端就真正成为客户自己的客户端应用的一部分,不存在同时安 装、运行两个应用程序的问题,整合的更加紧密、无缝。

    PC客户端SDK一般和云端管理、控制类API一起使用,在客户自己的客户端产品中实现完整 的会前、会中、会后等会议功能。

    2. 如何使用云会议PC SDK

    云会议PC-SDK是在windows操作系统下提供给第三方开发者的一组接口,包括接口文档、接口定义源代码文

    件、接口调用库文件等。通过该SDK,第三方开发者能够开发出带有全时云会议接入功能的软件产品。 支持的操作系统包括windows XP、windows7、windows10等。下面介绍云会议PC-SDK的使用方法。

    2.1. 获取云会议PC-SDK

    请联系全时客服人员或销售人员,获取PC-SDK开发资料。

    SDK接口以windows动态库DLL文件的形式提供,并提供接口定义C++头文件。 特别说明:提供的只是接口文件,不包括其他云会议客户端程序文件。首次调用接口会自动下载云会议客户端程

    序到本地电脑中,然后才能完成会议的各项功能。

    文件 说明
    GnetMeetingPlugin.dll 动态库文件,运行时用到。接收入会等请求,传递给云会议客户端。
    GnetMeetingPlugin.lib 用于静态加载DLL,加入第三方源代码工程中,链接时用到。
    IGnetMeetingPlugin.h 包含两个导出函数及接口类的定义,加入第三方源代码工程中,代码编译时用到。
    GnetMeetingPlugin.ini 程序的配置信息,无需改动

    接口头文件IGnetMeetingPlugin.h内容如下,后面会对其中的代码详细介绍:

    # if !defined(__IGNETMEETINGPLUGIN_H__)
    
    # define __IGNETMEETINGPLUGIN_H__
    
    # ifdef QSBEEPLUGIN_EXPORTS
    
    # define API_DECLSPEC
    
    # else
    
    # define API_DECLSPEC
    
    # endif
    
    # include "wtypes.h"
    
    # if _MSC_VER > 1000
    
    # pragma once
    
    # endif
    
    __declspec(dllexport)
    
    __declspec(dllimport)
    typedef enum JoinConferenceResult
    {
    
    MEETING_JOINED = 0, // 入会成功 
    
    MEETING_READIED, //组件初始化完成 
    
    MEETING_JOINFAILED, // 加入会议失败 
    
    MEETING_CLOSED, //离开或者结束会议 
    
    MEETING_SHOW_IMMAIN_WND, //显示窗口 
    
    MEETING_RESULT_COUNT
    }JoinConferenceResult;
    class IGnetMeetingPluginSink
    {
    
    public:
     virtual void NotifyUpdateResult(int Result) = 0; /*不需要更新(0);开始 
    
    更新(1);更新成功(2);更新失败(3);超时(4)*/
     virtual void NotifyUpdateProcess(int type, int percent, bool install) = 0; /* type 0:下载, 1:更新 percent 进度信息 isInstall true:初次安装,false:升级*/ }; 
    
    class IJoinConferenceSink
    {
    public:
    virtual void NotifyJoinConferenceResult(JoinConferenceResult Result) = 0;
    
    }; 
    
    class IGnetMeetingPlugin
    {
    
    public: /* 
    
    为空,则采用默认路径 */ 
    
    功能:完成SDK的初始化 logPath:存放插件日志的路径,不能包含文件名,文件名由插件自己定义,如果 
    
    ​```
        virtual int initSDK(const char *logPath) = 0;
    /*
    
    ​```
    
    */ 
    
    ​```
    功能:是否安装了Tang 返回值:如果为true,已经安装,如果为false,未安装 
    
    
    
    用户 */ 会人入会)*/ 
    
    /* 检查当前会议状态,返回 isMeeting:当前是否在开会,isSameUser:是否是同一个 
    
    /* isSameMeeting:0,不是同一场会,1,是同一场会(主持人入会) 2,是同一场会(参 
    
    
    ​```
    
     virtual bool isInstallTang() = 0;
    /*
    
    ​```
    */ 
    
    ​```
    
    功能:完成静默升级
     action:标识蜜蜂吊起云会议客户端,固定值为11 timeout:为超时时间,单位毫秒,建议为20000 updateType:0,定时升级云会议客户端,如果未安装,完成初始化安装 
    
    1,只进行一次升级,如果未安
    
    装,完成初始化安装 pSink:回调类,生命周期和动态库相同 
    
    virtual int updateMeetingClient(int appid, int siteid, int skinid,
    int action, int timeout, int updateType, const char *userid, IGnetMeetingPluginSink
    *pSink) = 0;
    
    /* 功能:监听云会议入会进度 */
     virtual int setJoinConferenceSink(IJoinConferenceSink *pSink) = 0; 
    
    /* 功能:设置云会议的配置信息 meetingConfig的格式必须是Json格式*/ virtual int setConfigInfo(const char *meetingConfig) = 0; 
    
    /* 入会前检查本地版本是否满足入会要求,如果返回true,表示可以直接入会,返回 false,表示升级本地云会议客户端, 外部调用需要等升级结束后再入会 */ 
    
    ​```
    virtual bool checkMeetingClientVersion(const char *cmdline,
    IGnetMeetingPluginSink *pSink) = 0;
    virtual bool checkMeetingState(const char *pcode, const char *userid,
    bool &isMeeting, int &isSameMeeting, bool &isSameUser) = 0;
    
    ​```
    
    起失败 
    
    功能:蜜蜂直接入会
     返回值:-1,表示内部逻辑错误 0,表示客户端程序吊起成功 1,表示客户端程序吊 
    
    101,表示当前正在吊起客户端程序 102,IE版本过低,无法吊起客户端程序 
    
    /* 显示云会议客户端 */
     virtual void showMeetingClientWnd() = 0; 
    
    /* 
    
    ​```
    */
    virtual int joinConference(
    
    ​```
    
    UINT32 nSessionID,
     UINT32 nSessionIDType,
     UINT32 nLoadType,
     UINT32 nRunMode,
     const char *createParameter,
     const char *cmdline, //入会吊起串 const char *headImageUrl//蜜蜂头像url 
    
    
    
    /* 
    
    起失败 2服务端错误(*pSrvStatus 5位服务端状态码,-1网络连接失败) 101,表示当前正在吊起客户端程序 
    
    }; 
    
    extern "C" { 
    
    ​```
            API_DECLSPEC
    pszInterfaceName);
            API_DECLSPEC
    
    ​```
    
    ) = 0; 
    
    from参数的含义是从普通的客户端登陆入会还是通过sdk入会。 如果from是pc,表示从pc端登陆入会。 如果from是uc,表示从整合sdk的整合的第三方工具入会。 
    
    email和userid可以设置为NULL
     功能:通过密码和账户入会
     返回值:-1,表示内部逻辑错误 0,表示客户端程序吊起成功 1,表示客户端程序吊 
    
    102,IE版本过低,无法吊起客户端程序 
    
    */
    virtual int joinConferenceEx(
                                 
                                 UINT32 nSessionID,
                                 UINT32 nSessionIDType,
                                 UINT32 nLoadType,
                                 UINT32 nRunMode,
                                 const char *createParameter,
                                 const char *password,
                                 const char *username,
                                 const char *headImageUrl,//蜜蜂头像url
                                 
                                 const char *from,
                                 const char *email,
                                 const char *userid,
                                 int* pSrvStatus=NULL
                                 ) = 0;
    
    void* _stdcall sgCreateInstance(const char *
                                    void _stdcall sgDestroyInstance(void* lpInterface);
    
    }
    

    2.2. 开发语言

    云会议PC-SDK目前只支持以C++方式接入到第三方应用程序中,建议的编译开发工具是Visual Studio 2005。

    如果第三方应用程序以其他编程语言开发,可以对该DLL进行封装,通过封装的模块提供第三方应用程序能够访 问的接又。

    2.3. 调用云会议PC-SDK接口

    云会议PC-SDK提供了入会、退会、升级等功能,需要跟云端API以及云会议PC客户端程序共同使用,才能够正 常工作。

    前置条件

    • 首先调用云端API进行帐号管理、安排会议、获取入会调起串等。

    • 确保与云会议uniform服务器网络通信畅通。

      入会

      调用PC-SDK接口进行入会操作,传入正确的云会议帐号数据、入会调起串等相关参数。

      首次安装及升级

    • 首次入会需要下载云会议PC客户端程序,需要确保与云会议升级服务器网络畅通、以及本地磁盘有足够

      空间(默认安装到<用户>\Quanshi\目录下)。

    • 云会议PC客户端程序已存在的情况下,通过SDK接口能够静默升级,手动或自动定期检查新版本,发

      现新版本自动后台升级。 整体结构图

      下面是第三方使用云会议PC-SDK的整体系统结构示意图:

      image-20190719

    下面简要介绍SDK接口的使用方法,并给出简单的Demo代码。

    2.3.1. 接口初始化

    接口以windows动态库方式对外提供,包括dll文件和对应的lib文件。

    • 首先加载dll文件,获取两个导出函数,调用导出函数得到接口对象指针(IGnetMeetingPlugin*类型)。

    • 然后调用接口对象指针提供的方法即可。

      一、加载动态库:

      1、静态加载:在第三方代码工程中引入GnetMeetingPlugin.lib及IGnetMeetingPlugin.h,然后可以直接在代码中 调用上面给出的两个导出函数。

      2、动态加载:调用系统API LoadLibrary加载动态库,然后调用GetProcAddress,传入导出函数名称,获得函数 指针。

      二、DLL导出函数:

      获得接又对象指针:参数传""即可,返回值强制转换为类型 (IGnetMeetingPlugin* pMeeting)

    void*   sgCreateInstance(const char * pszInterfaceName);
    

    销毁接又对象指针:程序退出前调用,传入上面返回的接又指针,释放资源。

    void    sgDestroyInstance(void* lpInterface);
    

    静态加载DLL并获得接口对象指针的Demo代码如下:

    【头文件】

    # include "IGnetMeetingPlugin.h"
    
    class BeePluginSink:IGnetMeetingPluginSink
    {
    public:
        void NotifyUpdateResult(int Result)
        {
            switch(Result){
            case 0:
    
    //... 在此判断result的值,处理升级结果,例如无需升级、升级成功、失败,直接给出提示信息。开始更新:显示等 待页面(升级结束,还会调用到这个函数中。) 
    
    } } 
    
     void NotifyUpdateProcess(int type, int percent, bool install)
     {
    
    switch(type){ case 0: //显示下载进度 case 1: //显示更新文件进度 }} 
    
    };
    class CMyAppData{
    public:
    
    static IGnetMeetingPlugin* pMeeting;//接口对象指针,定义为全局变量 static BeePluginSink mSink;//升级回调对象
     static BeePluginSink mSink;//升级回调对象 
    
    ... }  
    

    【源文件】 ...

    IGnetMeetingPlugin* CMyAppData::pMeeting=NULL;
    BeePluginSink CMyAppData::mSink;
    
    ... 
    
    //获取接又对象指针 CMyAppData::pMeeting=(IGnetMeetingPlugin*)sgCreateInstance(""); 
    

    三、操作接口对象指针:

    首先调用initSDK方法初始化SDK, 调用一次即可

    char *logPath=NULL;//日志保存路径,为空表示使用默认路径
    CMyAppData::pMeeting->initSDK(logPath);
    

    2.3.2. 是否安装了云会议客户端

    如果为true,已经安装,如果为false,未安装 
    bool isInstallTang()
    

    2.3.3. 升级

    调用updateMeetingClient方法初始化升级参数, 用户可以选择是定时升级,还是只升级一次

    // pMeeting->updateMeetingClient(appid, siteid, skinid, action, timeout, updateType, lpStrUserid,
    pSink);
    //函数参数含义后面有介绍, lpStrUserid是从云端API获取的用户帐号id
    CMyAppData::pMeeting->updateMeetingClient(6, 60001, 1, 11, 20000, 0, lpStrUserid,
    &CMyAppData::mSink);
    

    返回0成功,其他失败。 [注] pMeeting指代从DLL中创建的接口对象指针,用来调用会议接口,下同。

    关于此接口的详细介绍请参考 3 API说明。

    **2.3.4.**监听云会议入会进度

    入会时需要捕获当前处理进度,比如入会成功、失败、会议退出等状态进度,在入会接口前调用一个监听方法

    setJoinConferenceSink(IJoinConferenceSink *pSink) 对进度进行监听。demo代码如下: 增加全局对象mJoinSink处理入会进度,修改之前定义的CMyAppData类。

    【头文件】

    class JoinConfSink:IJoinConferenceSink
    {
    public:
        void NotifyJoinConferenceResult(JoinConferenceResult Result)
        {
            switch(Result){
            case MEETING_READIED:
    
    LOG_INFO(L"组件初始化完成,即将入会"); 
    
    ​```
                break;
            case MEETING_JOINED:
    ​```
    
    LOG_INFO(L"入会成功"); 
    
    ​```
                break;
            case MEETING_JOINFAILED:
    ​```
    
    LOG_INFO(L"加入会议失败"); break; 
    
    case MEETING_CLOSED: LOG_INFO(L"离开或者结束会议"); 
    
    ​```
                break;
            case MEETING_SHOW_IMMAIN_WND:
    ​```
    
    } } 
    
    } }; 
    
    LOG_INFO(L"(会议结束或隐藏)需要显示第三方主窗口"); break; 
    
    ​```
    class CMyAppData{
    public:
    ​```
    
    static IGnetMeetingPlugin* pMeeting;//接口对象指针,定义为全局变量 static BeePluginSink mSink;//升级回调对象
     static JoinConfSink mJoinSink;//入会事件回调对象 
    
    ... } 
    

    【源文件】

    BeePluginSink CMyAppData::mJoinSink; CMyAppData::pMeeting->setJoinConferenceSink(&CMyAppData::mJoinSink);//在此之后调用入会接口才能收到入会 
    
    的回调 
    

    2.3.5. 设置入会扩展参数

    会议需要一些扩展参数,为了保证扩展性,采用json字符串作为参数格式,方便将来增加新的会议参数。示例代码如下:

    std::string jsonStr="{ \"aac\": 1, \"aui\": 0 }"; //该字符串可以通过界面配置设定参数值后,组装而成,此处
    为测试填写的固定值。
    CMyAppData::pMeeting->setConfigInfo(jsonStr.c_str());//必须放在入会接口joinConference或
    joinConferenceEx之前
    

    关于此接口的详细介绍请参考 API说明。

    2.3.6. 检查会议状态和显示云会议客户端

    检查当前会议状态: 返回 isMeeting:当前是否在开会,isSameUser:是否是同一个用户

    isSameMeeting:0,不是同一场会,1,是同一场会(主持人入会) 2,是同一场会(参会人入会

    bool checkMeetingState(const char *pcode, const char *userid, bool &isMeeting, int &isSameMeeting, bool &isSameUser) 
    

    显示云会议客户端:

     void showMeetingClientWnd(); 
    

    2.3.7. 检查本地版本是否满足入会要求

    入会前检查本地版本是否满足入会要求,如果返回true,表示可以直接入会,返回false,表示升级本地云会议客

    户端, 外部调用需要等升级结束后再入会: 关于此接口的详细介绍请参考 API说明。

    2.3.8. 入会

    如需进入已安排的会议,调用接口指针的下面方法并传入会议参数即可,其中最重要的参数是调起串cmdline, 它是通过云端API得到的,包含有会议的很多关键信息。

    
    //pMeeting-> joinConference(nSessionID, nSessionIDType, nLoadType, nRunMode, createParameter, cmdline, headImageUrl);
    

    //cmdline从云端API获取,此处为示例数据

     std::string cmdline = "tang:///us:wssalesupgrade.quanshi.com|xjpdownload.quanshi.com/pc| djdownload.quanshi.com/pc|meetnow.quanshi.com/upgradeserver/up:80|80|80|80/app:6/skin:1/site: 60000/hs:1/aac:1/ahc:1/auv:0/aav:1/pinCode:7052/bpc:1/arc:0/fromTry:0/aasv:1/alo:1/hcv:0/autoET: 0/vmh:0/aaum:1/isMax:0/nt:3/pwdType:0/lang:cn/dm:meetnow.quanshi.com/Version:3.2.1.062/mv: 3.2.1.062/conf_id:1684604416/aal:7|10|11|9|12|14|16|8|6/cid:660301/huid:1867393/puid:1867393/ user_id:578990301/fuc:1/rc:0/dpm:d/vmit:1/rec:1/svc:776/productType:1/ums_user_id:1867393/ account:1/showAttInfo:1/cts_ip:203.174.108.243-bjsales-cts-rec2.quanshi.com|203.174.108.242- bjsales-cts-rec1.quanshi.com/dts_ip:119.253.82.17-gsalesdts2.quanshi.com/channel_info:1| 
    
    
    
    ​```
    167973740|167806234|167973741|167806235|258|167973748|167806242|167973749|167806243|259|
    167973750|167806244|167973751|167806245|516|167973752|167806246|167973753|167806247|775|
    167973742|167806236|167973743|167806237|776|167973744|167806238|167973745|167806239|777|
    167973746|167806240|167973747|167806241";
    int ret = CMyAppData::pMeeting->joinConference(100, 2, 2, 0, "ConferenceParameter",
    cmdline.c_str(), "");
    if(0!=ret){
    
    ​```
    
    //入会失败,请稍后重试 } 
    

    另外还有一个入会接口,通过会议密码方式入会,主持人入会需要传入主持人密码,参会人入会需要传入参会密 码。

    //pMeeting-> joinConferenceEx(nSessionID, nSessionIDType, nLoadType, nRunMode, createParameter, password, username, headImageUrl, from, email, userId, pSrvStatus);
     int srvStatus=-1;
     int ret = CMyAppData::pMeeting->joinConferenceEx(100, 2, 2, 0, "ConferenceParameter", "2017027841", "韩飞", "rr", “uc”, xxx@quanshi.com, “234234234”, &srvStatus); 
    
    ​```
    if(2==ret){
        if(srvStatus==-1){
    ​```
    
    //网络连接错误 }else{ 
    
    //到云端API错误状态码对照表转换错误信息,显示服务端错误信息,例如 50701 表示 密码错误 } 
    
    ​```
    }else
    if(0!=ret){
    ​```
    
    //入会失败,请稍后重试 } 
    

    关于此接口的详细介绍请参考 3 API说明。

    2.4. 编译、打包

    编译:客户C++工程中需要加入GnetMeetingPlugin.lib、IGnetMeetingPlugin.h。

    打包:第三方软件打包时只需要加入GnetMeetingPlugin.dll、 GnetMeetingPlugin.ini ,云会议客户端的其他程序文件将在运行时自动从服务器下载安装,所以无需加入到第三方软件安装包中。

    2.5. 更新升级

    云会议PC-SDK的升级包含两部分:

    • 接口动态库的升级:几乎不需要升级,如果有新的版本,会发布给客户,并添加到第三方程序安装包中, 跟随第三方程序的升级过程,更新到安装目录下。
    • 云会议客户端程序的升级:由SDK接口进行升级检查,如果发现新版本,则会在后台静默更新。第三方应 用程序通过调用SDK接口可以控制自动定期更新。

    3 API说明

    提供windows操作系统下接入全时云会议的功能,SDK包括下列文件:

    • GnetMeetingPlugin.dll

    • GnetMeetingPlugin.lib

    • IGnetMeetingPlugin.h

    • GnetMeetingPlugin.ini

      加载dll以后通过导出函数sgCreateInstance获得接又对象指针IGnetMeetingPlugin* pMeeting以后,即可通过 pMeeting提供的方法进行入会、升级等操作。

      接口对象IGnetMeetingPlugin提供了下列接口方法,下面依次介绍。

      3.1. 初始SDK

      描述:初始化SDK,要求在dll加载后立即调用。

       int initSDK (const char *logPath); 
      

      参数说明:

      参数 说明
      logPath 存放插件日志的路径,不能包含文件名,文件名由插件自己定义,例如"C:\Users\Hanfei\Documents\quanshiFiles\log". 如果为空,则默认为 C:\Users<用户>\AppData\Local\Quanshi\Bee\log **()**日志文件名称:GnetMeetingPlugin_日期时间.log
      [返回值] 0成功,其他失败。

    3.2. 客户端是否安装

    描述:判断客户本地是否安装了全时云会议客户端,返回true, 已安装,false未安装。

    bool isInstallTang(); 
    

    参数说明:

    参数 说明
    [返回值] true已安装,false未安装。

    3.3. 升级

    描述:对云会议客户端进行升级检查(如有新版本,自动下载并更新),返回0成功,其他失败。可以选择升级 类型。

    int updateMeetingClient( int appid, 
    int siteid,
     int skinid,
     int action,
     int timeout,
     int updateType,
     const char *userid, IGnetMeetingPluginSink *pSink); 
    

    参数说明:

    参数 说明
    appid 应用程序id(填6,以后再扩展)
    siteid 站点id(填60001,以后再扩展)
    skinid 云会议客户端显示的皮肤类型,默认填1
    action 标识调起的动作类型,填11(将来会增加其他值)。
    timeout 升级超时时长,单位毫秒(建议填20000)
    updateType 0,定时升级云会议客户端,如果未安装,完成初始化安装 1,只进行一次升级,如果未安装,完成初始化安装。 定时升级时,每天自动升级一次(早上0-6时内取1个随机时间点进行升级;如果升级失败,6时以后到24时会每隔10分钟尝试一次,直到升级处理成功)(无需升级也算处理成功)。
    userid 用户id,来自于云端API的登录接口返回值
    pSink 升级结果回调对象指针(生命周期和****动态库接口对象指针相同,否则会导致回调时异常)
    [返回值] 0成功,其他失败。

    回调指针pSink:IQsMeetingPluginSink中有一个虚函数,升级期间或结束时会回调该函数,需要监听对象实现 该函数:

    ​```
    class IGnetMeetingPluginSink
    {
    ​```
    
    public:
     virtual void NotifyUpdateResult(int result) = 0; //升级检查结果返回时调用此函数,并将处理结果传递 
    
    给result
     virtual void NotifyUpdateProcess(int type, int percent) = 0; /* 显示更新进度信息, type 0:下 
    
    载, 1:更新 percent 百分比*/ }; 
    

    result的值含义如下:

    result 说明
    0 不需要更新,已经是最新版本
    1 开始更新(还会继续回调)
    2 更新成功
    3 更新失败
    4 超时(下载配置文件超出初始化接口中传入的timeout时长)

    type的值含义如下:

    type 说明
    0 下载
    1 更新

    升级过程: 1)向服务器请求最新版本配置文件。 2)与本地版本信息比较,判断是否需要升级,无需升级则结束本次升级过程。 3)如需进行升级,则继续向服务器请求下载更新文件。 4)更新文件下载完毕,释放到安装目录,完成升级。

    3.4. 检查会议状态和显示云会议客户端

    参数说明:

    void showMeetingClientWnd();
    bool checkMeetingState(const char *pcode, const char *userid, bool &isMeeting, int
    &isSameMeeting, bool &isSameUser)
    
    参数 说明
    pcode 入会密码
    Userid 用户id
    isMeeting 当前是否在开会
    isSameUser 是否是同一个用户
    isSameMeeting 0,不是同一场会,1,是同一场会(主持人入会) 2,是同一场会(参会人入会)
    [返回值] 0成功,其他失败。

    3.5. 监听云会议入会进度

    描述:调用入会接口前设定pSink,然后调用入会接口,能够获知入会的各种状态,包括入会成功、失败、离开 会议等,并进行相应的处理。

     int setJoinConferenceSink(IJoinConferenceSink *pSink); //返回0成功,其他失败 
    

    目前能够响应下面几种会议事件状态:

    1. 入会成功
    2. 会议组件初始化完成(即将入会,如果成功会再收到入会成功事件) 3) 入会失败
    3. 离开或结束会议
    4. 显示主窗口(会议结束或隐藏,通知第三方显示自己的主窗口)
    参数 说明
    pSink 会议事件的回调函数(生命周期和动态库相同)
    [返回值] 0成功,其他失败。

    回调指针pSink:IJoinConferenceSink中有一个虚函数,入会开始或结束时调用,需要监听对象实现该函数:

    typedef enum JoinConferenceResult
    {
    
    MEETING_JOINED = 0, //入会成功 MEETING_READIED, //组件初始化完成 
    
    MEETING_JOINFAILED, //加入会议失败 
    
    MEETING_CLOSED, //离开或者结束会议 
    
    MEETING_SHOW_IMMAIN_WND //显示窗又 
    
    ​```
        MEETING_RESULT_COUNT
    }JoinConferenceResult;
    class IJoinConferenceSink
    {
        public:
            virtual void NotifyJoinConferenceResult(JoinConferenceResult Result) = 0;
    ​```
    
    }; 
    

    3.6. 设置入会扩展参数

    描述:入会需要设置一些扩展的参数,为了增加扩展性,采用json格式传入参数,将来新增参数可以很方便的加入,而无需修改接口格式。

    int setConfigInfo(const char *meetingConfig);
    
    参数 说明
    meetingConfig 扩展参数json字符串,符合标准json要求 { "参数名称" : 参数值, ... ... "参数名称" : 参数值 } [注]字符串类型的参数值用双引号括起来
    [返回值] 0成功,其他失败。

    会议扩展参数说明:【下列参数可以不传,或传部分。如果某个参数不传,将使用默认值】

    例如setConfigInfo("{\"aui\":0,\" lang\":\"en\"}"); //aac没传,使用默认值1 
    
    会****议参数名称 会****议参数说明
    aac 是否允许参会人外呼。 0 不允许; 1 允许. (**)**
    auvt 允许用户使用语音接入方式(没有默认值,不传的时候跟随QSboss走): 1: 电话+VOIP :1 2:电话主动呼入+VOIP: 2 3:仅电话 :3 4:仅VOIP :4 5:仅电话主动呼入: 5
    asd Allow share document 的缩写。是否允许该用户共享文档,仅针对主讲人有效。如果需要控制主讲人是否能共享文档,最好给每一个用户都要传该值。只有主讲人才能看到共享文档按钮,如果是主讲人并且asd为0时,此时不显示共享文档按钮。如果不传该值,走云会议自身的控制文档按钮显示隐藏逻辑(主讲人都能共享) 0:不允许共享文档 1:如果变为主讲人,该主讲人允许共享文档
    aui 是否允许使用会中邀请功能。 0 不允许; 1 允许使用所有的会中邀请功能(包括通讯录邀请,电话邀请,更多邀请); (**)** 2 仅使用电话外呼功能. 3|URL Protocol串 ,支持通过url scheme方式调起一个版本应用,3和URL Protocol串用竖线|分隔,比如可以通过这个调起云会议客户端(如果本地安装了):3|tang:///app:6/skin:1/site:60000/
    mpm mainPannelModel的缩写, 0表示普通面板模式,主窗口和池子分离。(认****) 1表示主窗口和池子合在一起
    alm attendeeListModel的缩写, 0不显示未入会列表, 1正常显示未入会列表。该字段仅对用户版账号设置有效。(认****)
    fbm feedbackModel,会中问题反馈的模式, 0为正常普通模式,跟现在一样,(认****) 1为面板中不显示邮箱一项。
    fst firstShareTip,表示第一次入会是否需要共享提示, 0为不显示, 1为显示。
    lang 表示会中国际化语言, zh_CN 中文, en 英文 其它 不做处理,默****认中文
    mim meetingInfoModel的缩写,会中主持人是否支持编辑会议. 0不支持编辑会议, 1可以编辑会议。(认****)
    otm overTipsModel的缩写,超过会议结束时间半小时之后,是否弹出提示。 0,不提示。(认****) 1,如果会议结束超过30分钟后,会给主持人提示。
    pan phoneAccessNumber缩写, 此处传入自定义"查看更多接入号"的URL地址。 不传或者传入值不合法,则使用默认值。
    rec 是否支持开启会中录制。 0为不开启会中录制,隐藏录制按钮; 1为正常显示录制按钮(仅主持人)(认****)
    skin 云会议支持的皮肤样式(如无需求,不传该字段): dark , 会中参会人列表以黑色样式显示

    3.7. 检查本地版本是否满足入会要求

    描述:入会前检查本地版本是否满足入会要求,如果返回true,表示可以直接入会,返回false,需要升级本地云 会议客户端, 外部调用需要等升级结束后再入会。

    bool checkMeetingClientVersion(const char *cmdline, IGnetMeetingPluginSink *pSink); 
    

    参数说明:

    参数 说明
    cmdline 入会调起长串。
    pSink 升级结果回调对象指针。
    [返回值] true 可以直接入会; false 需要等待升级结束后入会;

    3.8.入会**-**调起串方式

    描述:直接调起云会议客户端并入会(同步方式),通过调起串方式入会,调起串是通过云端API获得。

    ​```
    int joinConference(
        UINT32 nSessionID,
        UINT32 nSessionIDType,
        UINT32 nLoadType,
        UINT32 nRunMode,
        const char *createParameter,
        const char *cmdline,
        const char *headImageUrl
    ​```
    
    ); 
    

    参数说明:

    参数 说明
    nSessionID 会议id(通过云端API接口安排会议并获取会议信息)
    nSessionIDType 会话类型(1用户ID类型即点对点会话;2讨论组;3群;4会议)填4,以后扩展。
    nLoadType 加载类型(1聊天类型;2会议类型;3电话类型)填2,以后扩展。
    nRunMode 保留参数,填0
    createParameter 保留参数,固定填"createParameter"
    cmdline 入会调起长串,通过云端API接口获取。
    headImageUrl 用户头像url,会显示在会议窗口中。填""也可。
    [返回值] -1 内部逻辑错误; 0 入会成功; 1 入会失败; 101 当前正在入会中(上一次入会接口还未处理完); 102 IE版本过低,无法入会(最低支持IE8). 103该参会人的入会语音权限超过主持人账号配置的语音权限了

    3.9. 入会**-**密码方式

    描述:通过会议密码和用户名入会,无需调起串(同步方式),会议密码可通过云端API获取,或外部分享方式获得。用户名填写个人姓名或昵称即可, 如果参数中包含非英文字符,请使用utf-8格式

    ​```
    int joinConferenceEx(
        UINT32 nSessionID,
        UINT32 nSessionIDType,
        UINT32 nLoadType,
        UINT32 nRunMode,
        const char *createParameter,
        const char *password,
        const char *username,
       const char *headImageUrl,
       const char *from,
       const char *email,
        const char *userid,
        int* pSrvStatus=NULL
        );
    ​```
    
    ); 
    

    参数说明:

    参数 说明
    nSessionID 会议id(通过云端API接口安排会议并获取会议信息)
    nSessionIDType 会话类型(1用户ID类型即点对点会话;2讨论组;3群;4会议)填4,以后扩展。
    nLoadType 加载类型(1聊天类型;2会议类型;3电话类型)填2,以后扩展。
    nRunMode 保留参数,填0
    createParameter 保留参数,固定填"createParameter"
    password 会议密码pcode,分主持人密码和参会人密码两种。 如果是以主持人身份入会,请填写主持人密码; 如果是参会人,请填写参会人密码;
    username 用户名,填写实际姓名或昵称
    headImageUrl 用户头像url,会显示在会议窗口中。填""也可。
    from 入会方式:指的是从普通的客户端登陆入会还是通过sdk入会。 from取值pc的时候,表示从pc端登陆入会。 From取值uc的时候,表示从整合sdk的整合的第三方工具入会,通常是一些统一通信工具,即Unified Communication,比如全时的蜜蜂,顺丰的丰声等。
    email 用户的邮件地址,可以为空.
    userid 用户的user id,可以为空.
    pSrvStatus 服务器返回错误状态导致的入会失败时,可能会有服务端错误状态码,如果pSrvStatus非NULL,则填写将服务端错误状态码填写到 * pSrvStatus中。在使用该值前需先判断函数返回值。 函数返回值2: ----* pSrvStatus值为5位数字代表服务端错误码(见云会议Uniform接口返回码定义)。 ----* pSrvStatus值为-1代表网络连接失败。 函数返回其他值: ---- * pSrvStatus为-1代表无效值(此时无需处理 * pSrvStatus的值)。
    [返回值] -1 内部逻辑错误; 0 入会成功; 1 入会失败; 2 服务器返回错误状态导致入会失败(*pSrvStatus 5位服务端状态码,-1网络连接失败) ; 101 当前正在入会中(上一次入会接口还未处理完); 102 IE版本过低,无法入会(最低支持IE8). 103 该参会人的入会语音权限超过主持人账号配置的语音权限了

    **3.10.入会-**带界面

    描述:入会(为顺丰提供的临时接口, 在入会前进行升级,显示升级进度, 然后入会)。

    参数及参数含义与接口joinConferenceEx完全一致。

    int joinConferenceSF(
    
                         UINT32 nSessionID,
    
                         UINT32 nSessionIDType,
    
                         UINT32 nLoadType,
    
                         UINT32 nRunMode,
    
                         const char *createParameter,
    
                         const char *password,
    
                         const char *username,
    
                         const char *headImageUrl,//蜜蜂头像url
    
                         const char *from,
    
                         const char *email,
    
                         const char *userid,
    
                         int* pSrvStatus=NULL
    
    );
    

    参数说明:

    参数 说明
    nSessionID 会议id(通过云端API接口安排会议并获取会议信息)
    nSessionIDType 会话类型(1用户ID类型即点对点会话;2讨论组;3群;4会议)填4,以后扩展。
    nLoadType 加载类型(1聊天类型;2会议类型;3电话类型)填2,以后扩展。
    nRunMode 保留参数,填0
    createParameter 保留参数,固定填"createParameter"
    password 会议密码pcode,分主持人密码和参会人密码两种。 如果是以主持人身份入会,请填写主持人密码; 如果是参会人,请填写参会人密码;
    username 用户名,填写实际姓名或昵称。
    headImageUrl 用户头像url,会显示在会议窗口中。填""也可。
    from 入会方式:指的是从普通的客户端登陆入会还是通过sdk入会。 from取值pc的时候,表示从pc端登陆入会。 From取值uc的时候,表示从整合sdk的整合的第三方工具入会,通常是一些统一通信工具,即Unified Communication,比如全时的蜜蜂,顺丰的丰声等。
    email 用户的邮件地址,可以为空.
    userid 用户的user id,可以为空.
    pSrvStatus 服务器返回错误状态导致的入会失败时,可能会有服务端错误状态码,如果pSrvStatus非NULL,则填写将服务端错误状态码填写到 * pSrvStatus中。在使用该值前需先判断函数返回值。 函数返回值2: ----* pSrvStatus值为5位数字代表服务端错误码(见云会议Uniform接口返回码定义)。 ----* pSrvStatus值为-1代表网络连接失败。 函数返回其他值: ---- * pSrvStatus为-1代表无效值(此时无需处理 * pSrvStatus的值)。
    [返回值] -1 内部逻辑错误; 0 入会成功; 1 入会失败; 2服务端错误(*pSrvStatus 5位服务端状态码,-1网络连接失败) 101 当前正在入会中(上一次入会接口还未处理完); 102 IE版本过低,无法入会(最低支持IE8). 103该参会人的入会语音权限超过主持人账号配置的语音权限了.

    4. 【附录】云端API错误码描述

    错误码 含****义
    50001 数据库忙碌
    50002 上传文件的格式类型不支持或文件已损坏
    50003 文件大小超出上限xM
    50004 文件缺少字段{s}
    50005 导入联系人文件中联系人记录中存在数据格式错误
    50006 创建文件错误
    50007 下载错误
    50008 文件为空
    50009 文件上传成功,但是有错误
    --
    50020 组为空
    50021 通讯录最大允许创建100个组
    50022 组名不合法
    50023 组名已存在
    50024 待移动组不存在
    50025 添加组失败
    50026 编辑组失败
    50027 删除组失败
    50028 获取组失败
    --
    50040 通讯录中无联系人
    50041 导入联系人文件中联系人记录数超过最大限制2000
    50042 导入联系人文件中联系人记录数小于最小限制1
    50043 添加联系人失败
    50044 编辑联系人失败
    50045 移动联系人失败
    50046 删除联系人失败
    50047 通讯录中已存在该邮箱地址
    50048 通讯录中已存在该手机号码
    50049 邮箱地址不合法
    --
    50060 添加通讯录版本号失败
    50061 更新通讯录版本号失败
    --
    50080 输入错误
    1 字段值不能为空
    2 字段长度不合法
    3 字段格式不正确
    ---【文件】业务状态码-----------------------------
    50081 数据不整合
    50082 文件不存在
    50083 文件不可读
    50084 在文件中没找到该key
    50085 文件上传失败
    50101 HTTP请求方式(GET或POST)不合法
    50102 请求的数据为空
    50103 请求的参数不合法
    50104 服务器异常
    50105 服务端超时
    50106 传入的数据无法被正常解析为xml或json
    50107 传入的数据缺少必要字段
    50108 验证productappKey失败
    --
    50200 没有登录,需要登录
    50201 获取历史会议失败,请稍后重试
    50202 导入参会人失败,请稍后重试
    50203 文件可用记录为0,请重新上传
    50204 导入参会人记录条数超过上限
    50205 获取会议基本信息失败
    50206 查询邀请参会人失败
    50207 提醒入会失败
    50208 会中邀请参会人失败
    50209 没有找到相关会议
    --
    50310 获取ums帐号信息失败
    --
    50501 预约会议时长超过24小时
    50502 预约会议开始时间小于当前时间
    50503 预约会议失败
    50504 预约会议冲突
    50505 预约会议时间大于6个月之后的时间
    --
    50301 创建帐号失败
    50302 帐号验证,获取不到站点信息
    50303 创建帐号失败,手机号码不能为空
    50304 创建帐号,获取不到客户信息
    --
    50401 验证码错误
    50402 登录失败
    50403 帐号未激活
    50404 帐号所属站点被禁用
    50405 同一个帐号不能同时登录
    50406 帐号被禁用
    50407 帐号被过期
    50408 帐号被欠费
    50409 简约版用户不能登录
    50410 登录异常
    50501 预约会议时长超过24小时
    50502 预约会议开始时间小于当前时间
    50503 预约会议失败
    50504 预约会议冲突
    50505 预约会议时间大于6个月之后的时间
    --
    50601 时间有误
    50781 根据临时会议id查询不到会议ID
    50782 保存点名记录失败
    50783 根据临时用户id获取所有参会人信息为空
    50784 开启点名失败
    50785 获取点名信息失败
    50786 延时点名失败
    50787 结束点名失败,无法识别的结束取消标识
    50788 结束取消点名失败
    50789 点名已经结束或取消
    50790 已经签到,不能重复签到
    50791 更新签到信息失败
    50792 保存签到信息失败
    50793 获取签到信息失败
    50794 获取参会人信息失败,无法识别的签到类型标识
    --
    50701 密码错误
    50703 获取帐号产品状态欠费
    50704 获取帐号产品状态过期
    50705 获取帐号产品状态禁用
    50706 主持人不能同时进入多场会议
    50707 入会失败
    50708 会议结束时间小于当前时间
    50709 会议不存在
    50710 会议已结束
    50711 在会议开始时间前45分钟入会
    50712 主持人正在会中
    50713 参会人正在会中
    50714 会议已锁定
    50715 超方
    50716 站点被禁用
    50717 用户入会站点不正确
    50718 邮箱和密码不匹配
    50719 验证码不正确
    --
    50801 编辑会议失败
    50802 要变更的会议已过期
    50803 要变更的会议开始时间小于当前时间
    50804 要变更的会议不存在
    50806 要变更的会议已结束
    50807 会议冲突
    --
    50901 取消会议失败
    50902 要取消的会议不存在
    50903 50903
    --
    51001 举手错误
    --
    51101 Admin 错误
    51102 站点不存在
    51103 创建失败
    51104 搜索的userId不存在
    51105 更新失败
    51106 更改用户状态失败
    51107 客户码不存在
    --
    51201 不支持的产品类型
    51202 订阅会议失败
    51203 激活会议失败
    51204 预约会议失败
    51205 外呼列表为空失败
    51206 用户校验失败
    52000 此用户已开通PC3.0产品
    52001 传入的邮箱对应的手机号码与传入的手机号码不一致
    52002 传入的手机号码对应的邮箱与传入的邮箱不一致
    52003 用户创建失败
    52004 绑定邮箱
    52005 获取用户信息失败
    52006 帐号不存在
    52007 激活码过期
    52008 激活码不正确
    52009 帐号已激活过
    52010 关联UMS中用户产品信息失败
    52011 更新UMS中用户产品信息失败
    52012 URL已过期
    52013 设置登录密码失败
    52014 QSBOSS服务器连接失败
    52015 QSBOSS创建帐号失败
    52016 UMS服务器连接失败
    52017 获取站点信息为空
    52018 获取用户信息为空
    52019 获取用户产品信息为空
    52020 用户加入会议方式错误