本帖最后由 s0z0y 于 2012-4-5 10:30 编辑
龙笛插件开发快速入门手册 随着企业信息化程度的越来越高,即时通讯软件(IM)在企业信息化进程中不断被强化,作为信息传递的中枢,与OA、CRM、E-mail、SMS等软件的联系越来越紧密,并朝着平台化方向演变。为了方便企业用户深度整合各种OA相关的软件,个性化地定制属于自己的企业即时通讯系统,从龙笛1.5.0.25版本开始,引入了龙笛插件体系。 从而企业用户可以根据自己的需要,以龙笛为平台,借助龙笛SDK的二次开发接口,开发出满足企业业务需要的各类应用。 为了方便企业用户的开发,特撰写本文档。 龙笛插件体系 龙笛插件体系是建立在龙笛IM核心之上的一层接口、方法和二进制模块。主要由如下文件提供: ZJIMDef.h EIMPluginServiceDef.h EIMPluginServiceInc.h EIMPluginService.dll EIMPluginService.lib EIMPlugin.dll 目前的龙笛插件体系是以C++ header/lib/dll的方式工作的,由C++ header定义服务接口,lib提供接口函数的二进制链接,dll方式加载插件。因此,开发龙笛插件需要使用C++语言进行。 龙笛插件二进制接口规范 任何一个龙笛插件必须显式导出3个函数,它们由插件管理器调用: PluginInitialize PluginUninitialize PluginRegistered 三个函数的定义如下: typedef BOOL (*PLUGININITIALIZE)(EIMPluginInfo& stPluginInfo); typedef BOOL (*PLUGINUNINITIALIZE)(); typedef BOOL (*PLUGINREGISTERED)(LPCTSTR strCurrentPluginPath, UINT nPluginID); PluginInitialize:插件初始化。插件管理器调用此函数通知插件进行自身的初始化工作,并通过EIMPluginInfo结构体获得此插件的基本信息。 PluginUninitialize:插件反初始化。插件管理器调用此函数通知插件即将被卸载,须进行对象释放、状态复位等反向初始化工作。 PluginRegistered:插件注册完成。插件管理器在调用插件初始化之后调用此函数,在此函数中插件可向系统的各个slot区域注册自己的对象。 龙笛插件对象 目前只有两种对象,即插件对象和slot区域对象。每个插件至少有一个插件对象,而slot区对象,则可有可无,可多可少。 // 插件对象 typedef struct tagEIMPluginInfo { TCHAR szPluginGuid[33]; TCHAR szPluginName[32]; TCHAR szPluginDesc[256]; TCHAR szPluginComp[32]; TCHAR szPluginUrl[64]; UINT nSlotItems; }EIMPluginInfo, *LPEIMPluginInfo; // 插槽区对象 typedef struct tagEIMSlotItemInfo { SHORT nSlotItemInnerID; UINT nSlotItemType; TCHAR szSlotItemIcon[32]; TCHAR szSlotItemText[32]; TCHAR szSlotItemToolTip[64]; UINT nSlotItemMenu; }EIMSlotItemInfo, *LPEIMSlotItemInfo; 龙笛系统对插件的支持 龙笛系统提供三类接口供插件使用其服务,它们分别是: IEIMPluginManager:插件管理器接口 IEIMBaseService:为插件提供的基础服务接口 IEIMMessageService:为插件提供的消息服务接口 三个相应的全局函数可以获得以上三个接口: IEIMPluginManager* EIMGetPluginManager(); IEIMBaseService* EIMGetBaseService(); IEIMMessageService* EIMGetMessageService(); 龙笛插件接口 插件为了响应龙笛系统的各种事件或处理Plugin to Plugin的消息,必须实现下面的接口,供龙笛系统在需要的时候回调: IEIMPluginBaseProc:插件处理基本业务的接口 IEIMPluginMessageProc:插件处理消息的接口(暂不可用) IEIMPluginNotifyProc:插件内部消息处理接口 一个简单的示例 下面以抽奖插件为例说明在龙笛上开发一个插件的简单步骤。 第一步:创建一个DLL工程。 第二步:配置工程。 设置工程使用多字节字符集。 在stdafx.h中包含EIMPluginServiceInc.h文件。 定义插件的ID和名称。 #define EIM_PLUGIN_NAME _T("龙笛-抽奖插件") #define EIM_PLUGIN_ID _T("EIMPlugin.Lucky") 第三步:实现插件的三个基本函数。 在PluginInitialize中进行初始并填充传入的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; } 在PluginUninitialize进行反初始化。 BOOL PluginUninitialize() { return TRUE; } 在PluginRegistered中向聊天窗口和群窗口工具栏添加按钮,并添加消息处理接口: 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); } CZJRandom::Init(); return TRUE; } 第四步:实现插件的消息处理接口。 实现IEIMPluginNotifyProc接口,用于处理插件通普通消息通道或群消息通道发过来的消息。 实现IEIMPluginBaseProc接口,用于处理龙笛用户登录、退出等通知和UI界面的Windows消息。
利用这个插件,OA系统的通知、审批、新邮件信息等都可以通过弹出窗口进行提示。本人不在线,又可以自动转为短消息通知到手机上。 龙笛即时通信系统的引入,既提高了企业运行效率,又降低了通讯成本。 |