2012-07-23, 02:34 PM | #1 (permalink) |
论坛管理员
注册日期: 2009-07-01
帖子: 47
|
龙笛插件系统技术白皮书
LONG-D.Cn 龙笛插件系统技术白皮书 C++版 2012/7/22 详细介绍龙笛插件系统的依赖文件、导出函数、各种服务接口、各种回调接口以及各种相关结构体、事件、枚举和常量。 目录 第一章概述... 4 第二章客户端插件... 5 依赖文件... 5 插件模块导出函数... 5 插件管理器接口... 7 插件服务接口... 9 插件网络通信服务... 19 插件回调接口... 21 全局函数... 24 结构体及其它... 25 第三章服务端插件... 28 依赖文件... 28 插件模块导出函数... 28 服务端服务接口... 29 全局函数... 29 结构体... 29 第四章后台管理系统插件... 31 依赖文件... 31 插件模块导出函数... 31 插件服务接口... 32 全局函数... 32 结构体... 32 消息... 33 第一章 概述 随着企业信息化程度的越来越高,即时通讯软件(IM)在企业信息化进程中不断被强化,作为信息传递的中枢,与OA、CRM、E-mail、SMS等软件的联系越来越紧密,并朝着平台化方向演变。为了方便企业用户深度整合各种OA相关的软件,个性化地定制属于自己的企业即时通讯系统,从龙笛1.5.0.25版本开始,引入了龙笛插件体系。 在最初的版本中,龙笛插件体系仅支持客户端插件。随着龙笛版本的不断完善,插件体系也得到了发展。目前已支持三种不同的插件,分别是客户端插件、服务端插件、后台管理系统插件。三种插件从各个方面进一步完善了龙笛插件体系,为企业提供了更深入的二次开发和深度整合能力。 本文档着眼于全面介绍龙笛插件体系的细节,包括依赖文件、导出函数、各种服务接口、各种回调接口以及各种相关结构体、事件、枚举和常量。因此,本文档并不是一份有关龙笛插件开发的入门介绍。如果需要简要的入门开发指南,可以参见《龙笛插件开发快速入门手册》。 龙笛插件开发SDK随安装包一起发布,通常解压安装包后,有一个名为SDK的文件夹。该文件夹包括龙笛插件开发的全部头文件、库文件: ZJIMDef.h EIMPluginServiceDef.h EIMPluginServiceInc.h EIMPluginService.lib EIMPLGPluginServiceDef.h EIMPLGPluginServiceInc.h EIMPlgPluginService.lib EIMSysMgrPluginServiceDef.h EIMSysMgrPluginServiceInc.h EIMSysMgrPluginService.lib 目前的龙笛插件体系是以C++ header/lib/dll的方式工作的,由C++ header定义服务接口,lib提供接口函数的二进制链接,dll方式加载插件。因此,开发龙笛插件需要使用C++语言进行。 第二章 客户端插件 依赖文件 n 头文件:EIMPluginServiceInc.h n 库文件:EIMPluginService.lib 插件模块导出函数 一个客户端插件的入口DLL必须导出如下三个函数才能被系统加载并被识别为客户端插件: n PluginInitialize 插件被初始化时调用此函数,在此函数内插件通过EIMPluginInfo结构体设置插件GUID、插件名称、描述等信息,并进行插件内部状态初始化、资源分配等任务。 函数原型: BOOL PluginInitialize(EIMPluginInfo& stPluginInfo) 函数参数: stPluginInfo EIMPluginInfo结构体的引用,用于向系统返回插件信息。 示例代码: BOOL PluginInitialize(EIMPluginInfo& stPluginInfo) { stPluginInfo.nSlotItems = EIM_SLOT_CHATDLG_EDIT_TOOLBAR|EIM_SLOT_TRIBEDLG_EDIT_TOOLBAR; _tcscpy_s(stPluginInfo.szPluginGuid, 33, _T("CA308C19099749ae9ABAA6C4BF24DF26")); _tcscpy_s(stPluginInfo.szPluginComp, 32, _T("龙笛开发组")); _tcscpy_s(stPluginInfo.szPluginDesc, 256, _T("本插件实现掷骰子、抽奖功能,试一下您的运气,在单聊和群中娱乐!")); _tcscpy_s(stPluginInfo.szPluginName, 32, EIM_PLUGIN_NAME); _tcscpy_s(stPluginInfo.szPluginUrl, 64, _T("http://www.long-d.cn")); return TRUE; n PluginUninitialize 插件被卸载时调用此函数。在此函数内可进行插件自身的资源卸载等任务。 函数原型: BOOL PluginUninitialize(void) n PluginRegistered 系统在插件被加载及初始化完成后调用此函数,用于向插件提供一次机会,以便插件可以向系统的各个插槽区(slot)注册插槽对象和注册事件处理,或执行其它依赖于插件路径或插件ID的事务。 函数原型: BOOL PluginRegistered(LPCTSTR strCurrentPluginPath, UINT nPluginID) 函数参数: strCurrentPluginPath 字符串型,当前插件的绝对路径 nPluginID 无符号整型,系统分配给当前插件的ID 通常,插件需要以图标的形式出现在系统中某个界面的插槽区(slot)。比如,一些重要的插件常常在主界面的顶部工具栏上添加图标,或者是聊天窗口的工具栏上添加图标,甚至是在主界面的TAB标签区添加一个TAB标签,产生一个新的扩展区域。这样的功能,需要在此函数中调用系统提供的服务接口来添加插槽区(slot)对象,并添加必要的事件处理回调接口。 示例代码: 下面的代码将向聊天窗口和群窗口的工具栏注册一个插槽区对象,然后注册事件处理接口。插槽区对象通过EIMSlotItemInfo来定义,并通过IEIMPluginManager接口的AddSlotItem方法把插槽区对象注册到系统中。随后调用了IEIMPluginManager接口的AddBaseProc和AddPluginNotifyProc两个方法来添加两种事件处理的回调接口。 BOOL PluginRegistered(LPCTSTR strCurrentPluginPath, UINT nPluginID) { EIMSlotItemInfo slot_item; slot_item.nSlotItemInnerID = (WORD)ID_TOOLBARMENU_CAST; slot_item.nSlotItemMenu = IDR_MENU; slot_item.nSlotItemType = EIM_SLOT_CHATDLG_EDIT_TOOLBAR|EIM_SLOT_TRIBEDLG_EDIT_TOOLBAR; _tcscpy_s(slot_item.szSlotItemIcon, 32, _T("lucky_icon.png")); _tcscpy_s(slot_item.szSlotItemText, 32, _T("骰子")); _tcscpy_s(slot_item.szSlotItemToolTip, 32, _T("掷骰子、抽奖")); IEIMPluginManager* pPluginManager = EIMGetPluginManager(); if (pPluginManager != NULL) { pPluginManager->AddSlotItem(strCurrentPluginPath, nPluginID, slot_item); pPluginManager->AddBaseProc(nPluginID, &procNotify); pPluginManager->AddPluginNotifyProc(nPluginID, EIM_PLUGIN_ID, &procNotify); } return TRUE; 插件管理器接口 插件管理器接口IEIMPluginManager由系统提供,插件调用此接口主要用于添加、移除插槽区对象及各种事件处理的回调接口。 插件调用插件管理器接口IEIMPluginManager前,必须先获得该接口的指针,通过调用全局函数EIMGetPluginManager来实现。 该函数原型为: __declspec(dllexport) IEIMPluginManager* EIMGetPluginManager(); 插件管理器接口IEIMPluginManager主要提供了如下的方法供插件调用: n UINT AddSlotItem(LPCTSTR strCurrentPluginPath, UINT nPluginID, const EIMSlotItemInfo& item) 功能:添加插槽区对象。 返回:成功返回插槽区对象ID,失败返回0。 参数: strCurrentPluginPath 字符串型,当前插件绝对路径 nPluginID 无符号整型,插件ID item EIMSlotItemInfo结构体,描述插槽区对象 n BOOL RemoveSlotItem(UINT nPluginID, UINT nItemID) 功能:移除插槽区对象。 返回:成功返回TRUE,失败返回FALSE。 参数: nPluginID 无符号整型,插件ID nItemID 无符号整型,插槽区对象ID n BOOL AddBaseProc(UINT nPluginID, IEIMPluginBaseProc* pBaseProc) 功能:添加基本消息处理回调接口 返回:成功返回TRUE,失败返回FALSE。 参数: nPluginID 无符号整型,插件ID pBaseProc IEIMPluginBaseProc接口的指针,该接口由插件实现,用于处理基本的消息 n void RemoveBaseProc(UINT nPluginID, IEIMPluginBaseProc* pBaseProc) 功能:添加 返回:无 参数: nPluginID 无符号整型,插件ID pBaseProc IEIMPluginBaseProc接口的指针,该接口由插件实现,用于处理基本的消息 n BOOL AddMessageProc(UINT nPluginID, IEIMPluginMessageProc* pMessageProc) 功能:添加即时通讯消息处理回调接口 返回:成功返回TRUE,失败返回FALSE。 参数: nPluginID 无符号整型,插件ID pMessageProc IEIMPluginMessageProc接口的指针,该接口由插件实现,用于处理即时通讯消息 n void RemoveMessageProc(UINT nPluginID, IEIMPluginMessageProc* pMessageProc) 功能:添加 返回:无 参数: nPluginID 无符号整型,插件ID pMessageProc IEIMPluginMessageProc接口的指针,该接口由插件实现,用于处理即时通讯消息 n BOOL AddPluginNotifyProc(UINT nPluginID, LPCTSTR lpPluginID, IEIMPluginNotifyProc* pNotifyProc) 功能:添加插件通知处理回调接口 返回:成功返回TRUE,失败返回FALSE。 参数: nPluginID 无符号整型,插件ID lpPluginID 字符串型,插件字符串型ID,建议此ID由以圆点分隔的多个字符串组成,包含公司名称和插件名称,以保证插件ID的唯一性 pNotifyProc IEIMPluginNotifyProc接口指针,该接口由插件实现,用于处理插件的通知消息。 n void RemovePluginNotifyProc(LPCTSTR lpPluginID) 功能:移除插件通知处理回调接口 返回:无 参数: lpPluginID 字符串型,插件字符串型ID 为了让插件更好地控制系统,调用系统的功能,如获取当前登录用户的ID和状态,调用系统消息发送功能等,插件系统提供了多个服务接口供插件使用。 在使用这些服务接口前,插件需要先调用相应的全局函数获得这些接口的实例指针。 例如: IEIMBaseService* pBaseService = EIMGetBaseService(); if (pBaseService != NULL) { TCHAR szUserName[100]; szUserName[0] = 0; pBaseService->GetContactName(strSenderID, szUserName, 100); } n 基础服务接口:IEIMBaseService 该服务接口为插件提供一些最基础的服务,例如:获取龙笛系统的版本号、登录用户的ID、名称。 Ø void GetAppVersion(int& major, int& minor, int& modify, int& build) 功能:获取龙笛系统的版本号 返回:无 参数: major 整型,主版本号 minor 整型,次版本号 modify 整型,修订号 build 整型,编译次序号 Ø void GetCompanyName(CString& strCompanyName) 功能:获取当前已注册的公司名称 返回:无 参数: strCompanyName 字符串型,公司名称 Ø const CString& GetCurrentUserID() 功能:获取当前用户的ID 返回:字符串型,用户ID 参数:无 Ø long GetCurrentUserStatus() 功能:获取当前用户的在线状态 返回:长整型,表示在线状态。在线状态的定义请参见IMUserStatus 的定义。 参数:无 Ø int GetCurrentUserName(TCHAR szName[], int nBufferLen) 功能:获取当前用户姓名 返回:当前用户姓名的字符串长度 参数: szName 字符数组 nBufferLen 字符数组的长度 Ø BOOL SetCurrentUserStatus(long lStatus) 功能:设置当前用户的状态 返回:成功返回TRUE,失败返回FALSE。 参数: lStatus 长整型,表示在线状态。在线状态的定义请参见IMUserStatus 的定义。 Ø BOOL SetCurrentUserName(const TCHAR* szName) 功能:更改当前用户的姓名 返回:成功返回TRUE,失败返回FALSE。 参数: szName 字符串指针,指向新的姓名字符串 Ø void Logoff() 功能:注销当前已登录的用户 返回:无 参数:无 Ø void Exit() 功能:退出龙笛系统 返回:无 参数:无 Ø int GetTribeMemberCount(const CString& strTribeID) 功能:获取指定的群包含的成员数目 返回:整型,成员数目 参数: strTribeID 字符串型,指定群的ID Ø int GetTribeMemberIDs(const CString& strTribeID, LPTSTR* ppMemberIDs) 功能:获取群成员列表 返回:群成员列表的数目 参数: strTribeID 字符串型,指定群的ID ppMemberIDs 字符串指针的指针,用于返回成员列表的字符串型ID,指向的内存由本函数分配,在调用完毕由调用者释放。 Ø int GetCurrentUserPath(TCHAR szBuffer[], int nBufferLen) 功能:获取当前用户的绝对路径 返回:整型,用户路径字符串的长度 参数: szBuffer 字符数组 nBufferLen 字符数组的长度 Ø int GetContactName(const CString& strContactID, TCHAR szBuffer[], int nBufferLen) 功能:获取指定联系人的姓名 返回:整型,联系人姓名字符串的长度 参数: strContactID 字符串型,联系人的ID szBuffer 字符数组 nBufferLen 字符数组的长度 Ø int GetContactIconFile(const CString& strContactID, BOOL bOnline, TCHAR szBuffer[], int nBufferLen) 功能:获取联系人ICON文件的本地绝对路径 返回:整型,ICON文件字符串的长度 参数: strContactID 整整,联系人ID bOnline 布尔,指定获取在线图标,还是离线图标 szBuffer 字符数组 nBufferLen 字符数组的长度 Ø int GetContacts(std::vector<ContactBriefInfo*>& vecContacts) 功能:获取所有联系人 返回:整型,联系人数目 参数: vecContacts vector,用于返回所有联系人,联系人结构体参见 ContactBriefInfo 的定义 Ø void ReleaseContacts(std::vector<ContactBriefInfo*>& vecContacts) 功能:释放所获得的联系人列表 返回:无 参数: vecContacts vector,联系人列表,联系人结构体参见 ContactBriefInfo 的定义 Ø void GetMainServiceIPPort(DWORD& dwServerIpAddr, unsigned short& usServerPort) 功能:获取主服务器的IP地址和端口 返回:无 参数: dwServerIpAddr DWORD,服务器IP地址 usServerPort short,服务器端口 Ø void GetFileServiceIPPort(DWORD& dwServerIpAddr, unsigned short& usServerPort) 功能:获取文件服务器的IP地址和端口 返回:无 参数: dwServerIpAddr DWORD,服务器IP地址 usServerPort short,服务器端口 Ø void GetDataServiceIPPort(DWORD& dwServerIpAddr, unsigned short& usServerPort) 功能:获取数据服务器的IP地址和端口 返回:无 参数: dwServerIpAddr DWORD,服务器IP地址 usServerPort short,服务器端口 Ø void GetPluginServiceIPPort(DWORD& dwServerIpAddr, unsigned short& usServerPort) 功能:获取插件服务器的IP地址和端口 返回:无 参数: dwServerIpAddr DWORD,服务器IP地址 usServerPort short,服务器端口 Ø void SetMutexWnd(HWND hWnd) 功能:设置指定的窗口为互斥窗口。设为互斥窗口后,先前的互斥窗口将被关闭。系统中同一时间只会存在一个互斥窗口。 返回:无 参数: hWnd HWND,窗口句柄 Ø HWND GetMutexWnd() 功能:获取当前的互斥窗口 返回:HWND,窗口句柄 参数:无 Ø void AddAutoDeleteWnd(HWND hWnd) 功能:添加指定的窗口到自动删除窗口队列中。该窗口关闭后,将自动删除。 返回:无 参数: hWnd HWND,窗口句柄 Ø void RemoveAutoDeleteWnd(HWND hWnd) 功能:从自动删除窗口队列中移出指定的窗口。 返回:无 参数: hWnd HWND,窗口句柄 Ø HWND FindUniqueWnd(LPCTSTR strWndName) 功能:查找指定名称的唯一实例窗口。 返回:HWND,窗口句柄 参数: strWndName 字符串型,待查找的唯一实例窗口名称 Ø BOOL InsertUniqueWnd(LPCTSTR strWndName, HWND hWnd) 功能:添加指定的窗口到唯一实例窗口列表中。该窗口被添加后,同一时间将只能存在唯一的一个实例。 返回:成功返回TRUE,失败返回FALSE。 参数: strWndName 字符串型,窗口名称,窗口名称由使用方自定义,为保证其唯一性,需要包含特定的字符串和一定的长度 hWnd HWND,窗口句柄 Ø BOOL ReleaseUniqueWnd(LPCTSTR strWndName) 功能:释放唯一实例窗口。该窗口将被关闭和释放。 返回:成功返回TRUE,失败返回FALSE。 参数: strWndName 字符串型,窗口名称 Ø BOOL RemoveUniqueWnd(LPCTSTR strWndName) 功能:移除唯一实例窗口。该窗口仅从唯一实例列表中移除,不会被关闭和释放。 返回:成功返回TRUE,失败返回FALSE。 参数: strWndName 字符串型,窗口名称 Ø void GetAttachedWndPos(const CSize& sizeWnd, CPoint& point) 功能:获取附着到主窗口的合适的窗口位置 返回:无 参数: sizeWnd CSize,传入窗口的尺寸 point CPoint,传出窗口的位置 Ø void AdjustWindowPos(CWnd* pWnd, CWnd* pParentWnd = NULL, PluginChildWndPosition emPos = Plugin_Child_Attach, BOOL bSameHeight = FALSE, BOOL bLeftPriority = FALSE) 功能:自动调整窗口的位置和大小,使之附着到指定的父窗口的合适位置 返回:无 参数: pWnd CWnd,需要被调整的窗口指针 pParentWnd CWnd,父窗口的指针 emPos PluginChildWndPosition枚举值,指定附着方式 bSameHeight BOOL,是否与父窗口高度相同 bLeftPriority BOOL,是否左边附着优先考虑 Ø void SetMainFrmMainToolBarItemText(UINT nPluginID, UINT nItemID, LPCTSTR strItemText) 功能:设置主界面主工具栏的插件图标的文字 返回:无 参数: nPluginID UINT,插件ID nItemID UINT,工具栏图标ID strItemText 字符串型,图标项的文字 Ø void ShowSystemNotify(LPCTSTR szTitle, LPCTSTR szContent, LPCTSTR szUrl, UINT nPluginID, UINT nParam) 功能:显示一条系统通知 返回:无 参数: szTitle 字符串型,系统通知的标题 szContent 字符串型,系统通知的内容 szUrl 字符串型,系统通知的URL nPluginID UINT,插件ID nParam UINT,额外的自定义参数 Ø INT_PTR ShowSelectContactDlg(HWND hWndParent, LPCTSTR strWndTitle, DWORD dwMask, LPCTSTR strDefContacts, LPCTSTR strDefTribes, LPTSTR* pstrContacts, LPTSTR* pstrTribes) 功能:打开联系人选择器窗口 返回:INT_PTR,窗口关闭的返回值,如ID_OK\ID_CANCEL等 参数: hWndParent HWND,指定选择器窗口的父窗口 strWndTitle 字符串型,窗口标题 dwMask DWORD,掩码,用于指定显示何种选择器,目前其取值为 SEL_CONTACT_MASK_CONTACT、SEL_CONTACT_MASK_TRIBE strDefContacts 字符串型,指定初始的联系人ID列表,多个联系人ID之间以英文逗号分隔 strDefTribes 字符串型,指定初始的群ID列表,多个群 ID之间以英文逗号分隔 pstrContacts 字符串指针的指针,返回选择的联系人ID, 多个联系人ID之间以英文逗号分隔。内存分配在此函数中进行,调用方需要释放。 pstrTribes 字符串指针的指针,返回选择的群ID, 多个群ID之间以英文逗号分隔。内存分配在此函数中进行,调用方需要释放。 Ø BOOL SaveCurrentUserOption(LPCTSTR strSection, LPCTSTR strKey, LPCTSTR strValue) 功能:保存当前用户的选项 返回:成功返回TRUE,失败返回FALSE。 参数: strSection 字符串型,指定选项的section strKey 字符串型,指定选项的key strValue 字符串型,指定选项的value Ø BOOL LoadCurrentUserOption(LPCTSTR strSection, LPCTSTR strKey, TCHAR szBuffer[], int nBufferLen) 功能:加载当前用户的选项 返回:成功返回TRUE,失败返回FALSE。 参数: strSection 字符串型,指定选项的section strKey 字符串型,指定选项的key szBuffer 字符数组,返回指定选项的value nBufferLen 字符数组的长度 n 消息服务接口:IEIMMessageService 该服务接口为插件提供即时消息相关的服务,例如:打开聊天窗口、发送即时消息、发送插件通知消息。 Ø BOOL OpenChatDlg(const CString& strContactID, BOOL bActive) 功能:打开与指定联系人的聊天窗口 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,联系人ID bActive 布尔型,窗口是否被激活 Ø void CloseChatDlg(const CString& strContactID) 功能:关闭与指定联系人的聊天窗口 返回:无 参数: strContactID 字符串型,联系人ID Ø BOOL OpenTribeDlg(const CString& strTribeID, BOOL bActive) 功能:打开指定的群聊天窗口 返回:成功返回TRUE,失败返回FALSE。 参数: strTribeID 字符串型,群ID bActive 布尔型,窗口是否被激活 Ø void CloseTribeDlg(const CString& strTribeID) 功能:关闭群聊天窗口 返回:无 参数: strTribeID 字符串型,群ID Ø BOOL OpenGroupSendDlg(const CString& strContactIDs, const TCHAR* szMsg) 功能:打开群发消息窗口 返回:成功返回TRUE,失败返回FALSE。 参数: strContactIDs 字符串型,消息接收者ID,多个ID之间以英文逗号分隔 szMsg 字符串型指针,群发的消息内容 Ø BOOL SendMsg(const CString& strContactID, const TCHAR* szMsg) 功能:发送即时消息 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,消息接收者ID szMsg 字符串型指针,消息内容 Ø BOOL InputMsg(const CString& strContactID, const TCHAR* szMsg) 功能:输入消息到聊天窗口 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,消息接收者ID szMsg 字符串型指针,消息内容 备注:该方法暂时实现 Ø BOOL SendTribeMsg(const CString& strTribeID, const TCHAR* szMsg) 功能:发送群消息 返回:成功返回TRUE,失败返回FALSE。 参数: strTribeID 字符串型,群ID szMsg 字符串型指针,消息内容 Ø BOOL InputTribeMsg(const CString& strTribeID, const TCHAR* szMsg) 功能: 返回:成功返回TRUE,失败返回FALSE。 参数: strTribeID 字符串型,群ID szMsg 字符串型指针,消息内容 备注:该方法暂时实现 Ø BOOL SendGroupMsg(LPCTSTR lpContactIDs, const TCHAR* szMsg) 功能:发送群发消息 返回:成功返回TRUE,失败返回FALSE。 参数: lpContactIDs 字符串型指针,消息接收者ID,多个ID之间以英文逗号分隔 szMsg 字符串型指针,群发的消息内容 Ø BOOL SendAutoReplayMsg(const CString& strContactID, const TCHAR* szMsg) 功能:发送自动回复消息 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,消息接收者ID szMsg 字符串型指针,消息内容 Ø BOOL OpenSmsDlg(const TCHAR* szMobileNum) 功能:打开短信发送窗口 返回:成功返回TRUE,失败返回FALSE。 参数: szMobileNum 字符串型,移动电话号码 Ø BOOL SendSms(const TCHAR* szMobileNum, const TCHAR* szSms) 功能:发送短信 返回:成功返回TRUE,失败返回FALSE。 参数: szMobileNum 字符串型,移动电话号码 szSms 字符串型,短信内容 Ø BOOL GroupSendSms(TCHAR szMobileNums[][16], const TCHAR* szSms) 功能:群发短信 返回:成功返回TRUE,失败返回FALSE。 参数: szMobileNums 字符串型数组,移动电话号码列表 szSms 字符串型,短信内容 Ø BOOL InsertSysMsg2ChatDlg(const CString& strContactID, LPCTSTR lpSender, LPCTSTR lpMsg) 功能:向聊天窗口插入系统消息 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,消息接收者ID lpSender 字符串型指针,发送者名称 lpMsg 字符串型指针,消息内容 Ø BOOL InsertSysMsg2TribeDlg(const CString& strTribeID, LPCTSTR lpSender, LPCTSTR lpMsg) 功能:向群聊天窗口插入系统消息 返回:成功返回TRUE,失败返回FALSE。 参数: strTribeID 字符串型,群ID lpSender 字符串型指针,发送者名称 lpMsg 字符串型指针,消息内容 Ø BOOL SendPluginNormalNotify(const CString& strContactID, LPCTSTR lpPluginID, LPCTSTR lpPluginName, LPCTSTR lpMsg) 功能:发送插件的普通通知消息 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,接收者的联系人ID lpPluginID 字符串型指针,插件ID lpPluginName 字符串型指针,插件名称 lpMsg 字符串型指针,消息内容 Ø BOOL SendPluginTribeNotify(const CString& strTribeID, LPCTSTR lpPluginID, LPCTSTR lpPluginName, LPCTSTR lpMsg) 功能:发送插件的群通知消息 返回:成功返回TRUE,失败返回FALSE。 参数: strContactID 字符串型,接收者的联系人ID lpPluginID 字符串型指针,插件ID lpPluginName 字符串型指针,插件名称 lpMsg 字符串型指针,消息内容 Ø BOOL SendPluginGroupNotify(LPCTSTR lpContactIDs, LPCTSTR lpPluginID, LPCTSTR lpPluginName, LPCTSTR lpMsg) 功能:发送插件群发通知消息 返回:成功返回TRUE,失败返回FALSE。 参数: lpContactIDs 字符串型指针,接收者的联系人ID,多个ID之间以英文逗号分隔 lpPluginID 字符串型指针,插件ID lpPluginName 字符串型指针,插件名称 lpMsg 字符串型指针,消息内容 当插件需要网络通信服务时,不必自行从基础的功能开始开发,可以使用系统提供的基本网络通信服务。基本的网络通信服务基于套接字(socket)进行封装,为插件提供连接服务器及双向通信的能力。 插件网络通信服务通过IEIMPluginClientSocket 接口提供,插件须调用全局函数 EIMCreatePluginClientSocket 创建一个指向IEIMPluginClientSocket接口的对象实例。然后通过调用IEIMPluginClientSocket 接口的方法进行通信。 通信完毕不再使用时,插件须调用全局函数 EIMReleasePluginClientSocket 释放先前获得的IEIMPluginClientSocket 接口指针。 IEIMPluginClientSocket接口提供了如下的方法: Ø void SetTimeOut(DWORD dwConnectTimeOut, DWORD dwSendTimeOut, DWORD dwRecvTimeOut) 功能:设置连接、发送和接收的超时 返回:无 参数: dwConnectTimeOut DWORD,连接超时设置,毫秒 dwSendTimeOut DWORD,发送超时设置,毫秒 dwRecvTimeOut DWORD,接收超时设置,毫秒 Ø BOOL Connect(const CString& strIpAddr, unsigned short usPort) 功能:连接服务器 返回:成功返回TRUE,失败返回FALSE 参数: strIpAddr 字符串型,服务器IP地址 usPort 无符号短整型,服务器端口 Ø BOOL Connect(DWORD dwIpAddr, unsigned short usPort) 功能:连接服务器 返回:成功返回TRUE,失败返回FALSE 参数: dwIpAddr DWORD,服务器IP地址(主机顺序) usPort 无符号短整型,服务器端口 Ø BOOL ConnectByHostName(const CString& strServerName, unsigned short usPort) 功能:连接服务器 返回:成功返回TRUE,失败返回FALSE 参数: strServerName 字符串型,主机名称 usPort 无符号短整型,服务器端口 Ø DWORD GetHostIpAddr() const 功能:获取本机的IP地址 返回:DWORD,IP地址,主机顺序 参数:无 Ø void Disconnect() 功能:断开与服务器的连接 返回:无 参数:无 Ø BOOL Send(LPBYTE pData, int nDataSize) 功能:发送消息 返回:成功返回TRUE,失败返回FALSE 参数: pData BYTE指针,指向消息内容 nDataSize int,消息内容的字节长度 Ø BOOL RecvMsg(BYTE** ppData, int& nDataSize) 功能:接收消息 返回:成功返回TRUE,失败返回FALSE 参数: ppData BYTE型指针的指针,其内存由本方法分配,调用方须调用ReleaseMsg释放该指针 nDataSize int,返回接收到的消息长度 Ø void ReleaseMsg(BYTE** ppData) 功能:释放通过RecvMsg分配的内存 返回:无 参数: ppData BYTE型指针的指针,由RecvMsg返回的双指针 Ø long GetLastError() 功能:获取最后一次错误的ID 返回:错误ID 参数:无 当插件需要处理系统的消息,或插件自已的通知时,插件需要实现相应的回调接口。回调接口由插件按规范实现,系统在事件发生时进行调用。 目前有三类回调接口,插件根据需要有选择性地实现:基本消息处理接口、即时消息处理接口、插件内部通知事件处理接口。 每种回调接口实现后,插件需要把接口注册到插件系统中。注册上述三种回调接口分别是由IEIMPluginManager 接口的AddBaseProc、AddMessageProc和AddPluginNotifyProc实现的。 n 基本消息处理接口:IEIMPluginBaseProc Ø BOOL OnWindowsMessage(UINT nMsg, WPARAM wParam, LPARAM lParam, const CString& strIDContactOrTribe, BOOL bIsTribe) 功能:该方法用于处理一般性的windows消息,诸如按钮点击、菜单选中之类。插件注册到插槽区的对象被点击,菜单被用户选中,是通过本方法通知给插件的。 返回:如果消息已被处理,则返回TRUE;否则,对于不感兴趣的消息,返回FALSE 参数: nMsg、wParam、lParam 与Windows的消息处理函数意义相同 strIDContactOrTribe 字符串型,指示联系人或群的ID bIsTribe 布尔型,指示strIDContactOrTribe参数是否是群ID Ø BOOL OnCurrentUserStatusChanged(IMUserStatus emUserStatus) 功能:指示当前用户状态改变 返回:已响应返回TRUE,否则为FALSE 参数: emUserStatus IMUserStatus枚举,指示新的状态。参见IMUserStatus定义。 Ø BOOL OnCurrentUserLogon(IMUserStatus emUserStatus) 功能:指示用户登录成功 返回:已响应返回TRUE,否则为FALSE 参数: emUserStatus IMUserStatus枚举,指示当前状态。参见IMUserStatus定义。 Ø BOOL OnCurrentUserLogoff() 功能:指示当前用户注销 返回:已响应返回TRUE,否则为FALSE 参数:无 Ø BOOL OnContactStatusChanged(const CString& strContactID, IMUserStatus emUserStatus) 功能:指示联系人状态改变 返回:已响应返回TRUE,否则为FALSE 参数: strContactID 字符串型,联系人ID emUserStatus IMUserStatus枚举,指示新的状态。参见IMUserStatus定义。 Ø BOOL OnAppExit() 功能:指示龙笛系统即将退出 返回:已响应返回TRUE,否则为FALSE 参数:无 n 即时消息处理接口:IEIMPluginMessageProc 注意:本接口的回调暂未实现,将来的版本会实现,但有可能发生改变。 Ø BOOL OnNewMsg(const CString& strContactID, long lMsgType, TCHAR* szMsg) Ø BOOL OnNewTribeMsg(const CString& strTribeID, TCHAR* szMsg) Ø BOOL OnSendMsg(const CString& strContactID, long lMsgType, TCHAR* szMsg) Ø BOOL OnSendTribeMsg(const CString& strTribeID, TCHAR* szMsg) Ø BOOL OnNewSms(const TCHAR* szMobileNum, TCHAR* szSms) Ø BOOL OnSendSms(const TCHAR* szMobileNum, TCHAR* szSms) Ø BOOL OnNewSysMsg(const DATE* dtMsgTime, const TCHAR* szTitle, const TCHAR* szContent) Ø BOOL OnNewEmailNotify(const DATE* dtMsgTime, const TCHAR* szSender, const TCHAR* szSubject, const TCHAR* szContent, UINT nNewMailCount) n 插件内部通知事件处理接口:IEIMPluginNotifyProc 本接口有2个方法,一个用于接收普通即时消息,另一个用于接收群消息。 通常,插件自己内部的简单通信可通过调用IEIMMessageService 接口的SendPluginNormalNotify方法和本接口的OnRecvNormalMsg方法来完成。相应的群内的插件通信可通过调用SendPluginTribeNotify 和OnRecvTribeMsg 来完成。 Ø BOOL OnRecvNormalMsg(const DATE& dtTime, const CString& strSenderID, LPCTSTR lpMsg, BOOL bOfflineMsg) 功能:接收插件内部普通即时消息 返回:通过返回值指示本消息是否被处理,若被处理则返回TRUE,否则,返回FALSE 参数: dtTime DATE,消息发送时间 strSenderID 字符串型,发送者ID lpMsg 字符串型,消息内容 bOfflineMsg 布尔值,是否为离线消息 Ø BOOL OnRecvTribeMsg(const DATE& dtTime, const CString& strSenderID, const CString& strTribeID, LPCTSTR lpMsg, BOOL bOfflineMsg) 功能:接收插件内部群消息 返回:通过返回值指示本消息是否被处理,若被处理则返回TRUE,否则,返回FALSE 参数: dtTime DATE,消息发送时间 strSenderID 字符串型,发送者ID strTribeID 字符串型,群ID lpMsg 字符串型,消息内容 bOfflineMsg 布尔值,是否为离线消息 全局函数 n EIMGetPluginManager 获取插件管理器对象的指针 函数原型: __declspec(dllexport) IEIMPluginManager* EIMGetPluginManager(); n EIMGetBaseService 获取基础服务接口的指针 函数原型: __declspec(dllexport) IEIMBaseService* EIMGetBaseService(); n EIMGetMessageService 获取消息服务接口的指针 函数原型: __declspec(dllexport) IEIMMessageService* EIMGetMessageService(); n EIMCreatePluginClientSocket 创建可供插件使用的客户端套接字(socket) 函数原型: __declspec(dllexport) BOOL EIMCreatePluginClientSocket(LPCTSTR szPluginGUID, IEIMPluginClientSocket** ppClientSocket); n EIMReleasePluginClientSocket 释放可供插件使用的客户端套接字(socket) 函数原型: __declspec(dllexport) void EIMReleasePluginClientSocket(IEIMPluginClientSocket** ppClientSocket); n EIMPluginInfo 该结构体用于PluginInitialize函数调用时把插件信息传给系统。插件信息包含插件GUID、插件名称等信息。 typedef struct tagEIMPluginInfo { TCHAR szPluginGuid[33]; TCHAR szPluginName[32]; TCHAR szPluginDesc[256]; TCHAR szPluginComp[32]; TCHAR szPluginUrl[64]; UINT nSlotItems; Ø szPluginGuid 字符串型,插件GUID Ø szPluginName 字符串型,插件名称 Ø szPluginDesc 字符串型,插件描述 Ø szPluginComp 字符串型,插件开发公司名称 Ø szPluginUrl 字符串型,插件开发公司网址 Ø nSlotItems UINT,插件将在哪些区域添加插槽区对象 n EIMSlotItemInfo 该结构体用于向插件系统注册插槽区对象。注册插槽区对象一般至少需要提供插槽区对象类型,内部ID、图标或文字等信息。 typedef struct tagEIMSlotItemInfo { SHORT nSlotItemInnerID; UINT nSlotItemType; TCHAR szSlotItemIcon[32]; TCHAR szSlotItemText[32]; TCHAR szSlotItemToolTip[64]; UINT nSlotItemMenu; UINT nSlotItemWnd; Ø nSlotItemInnerID 短整型,指定一个内部ID Ø nSlotItemType 整型,插件类型的组合 Ø szSlotItemIcon 字符串型,图标文件相对路径 Ø szSlotItemText 字符串型,文字 Ø szSlotItemToolTip 字符串型,Tooltip Ø nSlotItemMenu 整型,菜单资源ID Ø nSlotItemWnd 暂未使用 n EIMTABSELCHANGED 该结构体用于WM_MAINTAB_SELECTED消息处理时,把LPARAM参数造型为EIMTABSELCHANGED,通过本结构体获得容器窗口的信息。 typedef struct tagEIMTABSELCHANGED { HWND hContainerWnd; RECT rtContainerClient; Ø hContainerWnd HWND,容器窗口句柄 Ø rtContainerClient RECT,容器窗口位置和尺寸 n PluginChildWndPosition 本枚举定义子窗口与父窗口的相对关系,目前只有两种:居中和附着。 enum PluginChildWndPosition { Plugin_Child_Center, Plugin_Child_Attach, n 插件类型 Ø EIM_SLOT_MAINFRM_TOP_TOOLBAR:主界面顶部工具栏 Ø EIM_SLOT_MAINFRM_BOTTOM_TOOLBAR:主界面底部工具栏 Ø EIM_SLOT_CHATDLG_TOP_TOOLBAR:聊天窗口顶部工具栏 Ø EIM_SLOT_CHATDLG_EDIT_TOOLBAR:聊天窗口编辑工具栏 Ø EIM_SLOT_TRIBEDLG_TOP_TOOLBAR:群窗口顶部工具栏 Ø EIM_SLOT_TRIBEDLG_EDIT_TOOLBAR:群窗口编辑工具栏 Ø EIM_SLOT_MAINFRM_TAB:主界面TAB标签区 n 消息 消息(message) WPARAM wParam LPARAM lParam WM_SYSNOTIFY_CLICKED 调用ShowSystemNotify的nParam unused WM_MAINTAB_SELECTED 插件插槽对象(Slot Item)的ID EIMTABSELCHANGED结构体指针,包括容器窗口句柄和窗口矩形尺寸 WM_MAINTAB_UNSELECTED 同上 同上 WM_MAINTAB_SIZE CRect对象指针,指示当前容器的尺寸 unused 第三章 服务端插件 依赖文件 n 头文件:EIMPLGPluginServiceInc.h n 库文件:EIMPLGPluginService.lib 插件模块导出函数 一个服务端插件的入口DLL必须导出如下三个函数才能被系统加载并被识别为服务端插件: n PLGPluginInitialize 插件被初始化时调用的函数,在此函数内插件通过EIMPLGPluginInfo结构体设置插件GUID、插件名称、描述等信息,并进行插件内部状态初始化、资源分配等任务。 函数原型: BOOL PLGPluginInitialize(EIMPLGPluginInfo& stPLGPluginInfo) n PLGPluginUninitialize 插件被卸载时调用此函数,在此函数内可进行插件自身的资源卸载等任务。 函数原型: BOOL PLGPluginUninitialize() n PLGPluginNetMsg 服务端接收到客户端插件发送的消息时,将根据插件的ID进行消息派发,插件通过此函数处理客户端插件发送的消息。 函数原型: BOOL PLGPluginNetMsg(void* pSocketHandle, LPBYTE pMsgData, int nMsgDataLen) 参数: pSocketHandle void*,表示Socket的内部句柄,在调用IEIMPlgSvrBaseService接口的SendToClient发送消息时需要此参数 pMsgData 字节数组,保存着消息的内容 nMsgDataLen 整型,消息内容的长度 服务端服务接口 目前服务端向插件提供了基础的服务接口IEIMPlgSvrBaseService,使用该接口可以与客户端进行通信。 插件通过全局函数EIMGetPlgSvrBaseService 获取IEIMPlgSvrBaseService接口指针,然后调用该接口的方法。 IEIMPlgSvrBaseService提供的方法: n BOOL SendToClient(void* pSocketHandle, int nMsgType, LPBYTE pMsgData, int nMsgDataLen) 功能:该方法向客户端插件发送一条消息 返回:发送成功返回TRUE,失败返回FALSE 参数: pSocketHandle void*,由PLGPluginNetMsg函数传的socket句柄 nMsgType int,自定义的消息ID,由插件客户端与服务端协定。 pMsgData BYTE指针,指向消息数据 nMsgDataLen int,消息数据的字节长度 全局函数 n EIMGetPlgSvrBaseService 该函数用于获取基础服务接口。 函数原型: __declspec(dllexport) IEIMPlgSvrBaseService* EIMGetPlgSvrBaseService(); 结构体 n EIMPLGPluginInfo 该结构体用PLGPluginInitialize函数调用时把插件信息传给系统。插件信息包含插件GUID、插件名称等信息。 typedef struct tagEIMPLGPluginInfo { TCHAR szPluginGuid[33]; TCHAR szPluginName[32]; TCHAR szPluginDesc[256]; TCHAR szPluginComp[32]; TCHAR szPluginUrl[64]; Ø szPluginGuid 字符串型,插件GUID Ø szPluginName 字符串型,插件名称 Ø szPluginDesc 字符串型,插件描述 Ø szPluginComp 字符串型,插件开发公司名称 Ø szPluginUrl 字符串型,插件开发公司网址 第四章 后台管理系统插件 依赖文件 n 头文件:EIMSysMgrPluginServiceInc.h n 库文件:EIMSysMgrPluginService.lib 插件模块导出函数 一个后台管理系统插件的入口DLL必须导出如下三个函数才能被系统加载并被识别为后台管理插件: n SysMgr_PluginInitialize 插件被初始化时调用的函数,在此函数内插件通过EIMSysMgrPluginInfo结构体设置插件GUID、插件名称、描述等信息,并进行插件内部状态初始化、资源分配等任务。 函数原型: BOOL SysMgr_PluginInitialize(EIMSysMgrPluginInfo& stPluginInfo); n SysMgr_PluginUninitialize 插件被卸载时调用此函数,在此函数内可进行插件自身的资源卸载等任务。 函数原型: BOOL SysMgr_PluginUninitialize(); n SysMgr_PluginMsg 后台管理程序通过该函数通知插件有关插件视图显示、隐藏和尺寸变化等事件。插件应当响应这些事件,执行相应的动作。例如,SysMgrHostMsg_ShowView事件发生时,创建插件的窗体,SysMgrHostMsg_HideView事件发生时,销毁插件的窗体。 函数原型: BOOL SysMgr_PluginMsg(UINT message, WPARAM wParam, LPARAM lParam); 函数参数: UINT message—指示事件ID,其值可能是SysMgrHostMsg_ShowView、SysMgrHostMsg_HideView或SysMgrHostMsg_OnSize等; WPARAM wParam—消息参数,其意义视消息ID而定; LPARAM lParam—消息参数,其意义视消息ID而定。 插件服务接口 n IEIMSysMgrHostService 该服务接口用于向插件提供一种访问系统数据的能力,目前主要用于从系统中获取当前公司名称和员工简要信息。 该服务接口通过全局函数 EIMGetSysMgrHostService 获取 __declspec(dllexport) IEIMSysMgrHostService* EIMGetSysMgrHostService(); 该服务接口包含如下方法: l BOOL GetCompanyName(CString& strCompanyName) 获取公司名称。公司名称通过strCompanyName返回。 l BOOL GetStaffInfos(std::vector<LPEIMStaffBriefInfo>& vecStaffInfos) 获取员工简要信息列表。员工简要信息列表通过vecStaffInfos返回。LPEIMStaffBriefInfo结构体的具体定义见下文结构体部分的描述。 n EIMGetSysMgrHostService 该函数用于获取后台管理系统提供的服务接口 函数原型: __declspec(dllexport) IEIMSysMgrHostService* EIMGetSysMgrHostService(); 结构体 n EIMSysMgrPluginInfo 该结构体用于SysMgr_PluginInitialize函数调用时把插件信息传给系统。插件信息包含插件GUID、插件名称等信息。 typedef struct tagEIMSysMgrPluginInfo { TCHAR szPluginGuid[33]; TCHAR szPluginName[32]; TCHAR szPluginDesc[256]; TCHAR szPluginComp[32]; TCHAR szPluginUrl[64]; Ø szPluginGuid 字符串型,插件GUID Ø szPluginName 字符串型,插件名称 Ø szPluginDesc 字符串型,插件描述 Ø szPluginComp 字符串型,插件开发公司名称 Ø szPluginUrl 字符串型,插件开发公司网址 n EIMStaffBriefInfo 该结构体用于通过IEIMSysMgrHostService接口的GetStaffInfos方法返回员工的简单描述信息。 typedef struct tagEIMStaffBriefInfo { CString m_strStaffID; CString m_strName; CString m_strSignature; IMUserSex m_emSex; }EIMStaffBriefInfo, *LPEIMStaffBriefInfo; l m_strStaffID 字符串型,员工ID l m_strName 字符串型,员工名字 l m_strSignature 字符串型,员工签名 l m_emSex 枚举类型,员工性别 消息 SysMgr_PluginMsg函数的消息及其参数的意见见下表: 消息(message) WPARAM wParam LPARAM lParam l SysMgrHostMsg_ShowView 插件容器窗口句柄 Unused l SysMgrHostMsg_HideView 插件容器窗口句柄 Unused l ysMgrHostMsg_OnSize 插件容器窗口句柄 Unused
__________________
让世界倾听我们的笛声。 |