




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 第 1 頁 共 20 頁RTXCRTXC 插件開發(fā)指南插件開發(fā)指南 StepStep byby stepstep騰訊科技(深圳)有限公司騰訊科技(深圳)有限公司版權(quán)所有 侵權(quán)必究 第 2 頁 共 20 頁目目 錄錄1、開發(fā)前準(zhǔn)備、開發(fā)前準(zhǔn)備 .42、創(chuàng)建插件工程、創(chuàng)建插件工程 .43、界面上的體現(xiàn)、界面上的體現(xiàn) .84、交互控制、交互控制 .115、收發(fā)數(shù)據(jù)處理、收發(fā)數(shù)據(jù)處理 .176、插件打包發(fā)布、插件打包發(fā)布 .217、后語、后語 .21 第 3 頁 共 20 頁1、開發(fā)前準(zhǔn)備、開發(fā)前準(zhǔn)備需要安裝如下文件:RTXClient 安裝包 RTXClient SDK 安裝包開發(fā)插件的過程一般是
2、要經(jīng)歷一下幾個步驟:創(chuàng)建插件工程,RTX 客戶端里界面上體現(xiàn),交互控制,數(shù)據(jù)傳輸,打包發(fā)布;以下的用例是開發(fā)一個程序共享的插件,通過介紹開發(fā)程序共享的插件,來講解插件的一般開發(fā)過程。2、創(chuàng)建插件工程、創(chuàng)建插件工程創(chuàng)建插件工程,首先把 RTXC SDK 目錄中 wizard 目錄下的 RTXCModuleAW.awx文件拷至 VC 安裝目錄 Microsoft Visual StudioCOMMONMSDev98Template ,然后在 VC 中創(chuàng)建一個插件工程。第一步:創(chuàng)建一個 AppSharePlugin 工程。 第 4 頁 共 20 頁第二步:設(shè)置插件的信息。第三步:設(shè)置插件內(nèi)部邦定的事
3、件。 第 5 頁 共 20 頁完成以上三個步驟之后,可以自動生成如下函數(shù): 第 6 頁 共 20 頁這些自動生成的代碼,已經(jīng)定義了 RTXC 的接口函數(shù),一個插件的基本框架已經(jīng)搭建成功,用戶只需要在這些接口函數(shù)里添加自己的功能。創(chuàng)建完成一個插件工程之后,就需要考慮在 RTX 的客戶端界面能體現(xiàn)出該插件,如菜單、面板、TAB 或者在 RTXC 其他的界面元素上;程序共享主要在 RTXC 的菜單上增加一個新的菜單項來體現(xiàn),其他的體現(xiàn)方式,可以參看 RTXC SDK 文檔。 第 7 頁 共 20 頁3、界面上的體現(xiàn)、界面上的體現(xiàn)程序共享一般需要在 RTX 客戶端的菜單中添加“程序共享”的菜單項,操作
4、步驟如下:第一步:設(shè)置動態(tài)菜單相關(guān)的內(nèi)容。首先在 Stdafx.h 文件中添加如下代碼:#import ClientObjects.tlb raw_interfaces_only no_namespace, named_guids#include RTXCModuleIds.h在插件中實現(xiàn)動態(tài)的添加和刪除菜單,就必須包含 ClientOjbect.tlb 和RTXModuleIds.h 這兩個文件,這兩個文件分別位于 SDK 安裝目錄下的 TLB 和 INCLUDE目錄下,用戶可以根據(jù)實際情況,設(shè)置文件的相對路徑。然后在 AppSharePluginModule.h 文件中增加菜單對象的定義和
5、菜單響應(yīng)的函數(shù),如下:IRTXCMenuPtrm_pMenu; / 定義 RTXC 菜單對象IRTXCUICommand*m_pUICmd;定義菜單響應(yīng)函數(shù)的接口:BEGIN_DUAL_INTERFACE_PART(MenuSink, IRTXCUICommand)STDMETHOD(OnInvoke)(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter)METHOD_PROLOGUE(CAppSharePluginModule, MenuSink)return pThis-OnInvoke(UIType, Id, Parameter);S
6、TDMETHOD(OnQueryState)(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter, BSTR* Text, enum RTXC_UI_ITEM_STATE* State)METHOD_PROLOGUE(CAppSharePluginModule, MenuSink)return pThis-OnQueryState(UIType, Id, Parameter, Text, State);END_DUAL_INTERFACE_PART(MenuSink)定義菜單響應(yīng)的接口函數(shù):HRESULT OnInvoke(enum RTX
7、C_UI_TYPE UIType, long Id, VARIANT Parameter);HRESULT OnQueryState(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter, BSTR* Text, enum RTXC_UI_ITEM_STATE* State); 第 8 頁 共 20 頁在 AppSharePluginModule.cpp 文件中,需要添加如下代碼:/ 實現(xiàn)標(biāo)準(zhǔn)的 IDispatch 方法DELEGATE_DUAL_INTERFACE(CAppSharePluginModule, MenuSink)/ 實現(xiàn)菜單
8、響應(yīng)的實現(xiàn)函數(shù):HRESULT CAppSharePluginModule:OnQueryState(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter, BSTR* Text, enum RTXC_UI_ITEM_STATE* State)return S_OK;HRESULT CAppSharePluginModule:OnInvoke(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter)return S_OK;第二步:添加動態(tài)菜單。在 AppSharePluginModule.cp
9、p 文件中的 OnLoad 函數(shù)中,實現(xiàn)添加菜單的功能,代碼如下:/ 添加菜單,其中ID_BENGIN_SCREEN_SHARE 為自定義的菜單項的 IDIRTXCModulePtr& module = m_ptrRoot-ModuleRTX_MODULE_IDENTIFIER_CLIENT_OBJS;IClientObjectsModulePtr ClientObjects = module;CComPtr ptrMenu;if(FAILED(ClientObjects-get_Object(_bstr_t(_T(RTXCMenu),(IDispatch*)&ptrMenu)
10、 | ptrMenu = NULL)throw RTX_UNSPECIFIC_ERROR;/ 在主窗口的操作菜單中添加項if (FAILED(ptrMenu-AddItem(VARIANT_FALSE, -1, RTXC_UI_TYPE_MAINFRAME_ACTION, ID_BENGIN_SCREEN_SHARE, &m_xMenuSink, _T(應(yīng)用程序共享), NULL, RTXC_MENU_ITEM_SEPARATOR_BELOW, 3, VARIANT_FALSE)throw RTX_UNSPECIFIC_ERROR;/ 在組織架構(gòu)里的用戶上的右鍵菜單中添加項if (FA
11、ILED(ptrMenu-AddItem(VARIANT_FALSE, -1, RTXC_UI_TYPE_ORG_STRUCT_USER, 第 9 頁 共 20 頁ID_BENGIN_SCREEN_SHARE, &m_xMenuSink, _T(應(yīng)用程序共享), NULL, RTXC_MENU_ITEM_SEPARATOR_BELOW, 3, VARIANT_FALSE)throw RTX_UNSPECIFIC_ERROR;/ 在 IM 窗口添加第三方菜單if (FAILED(ptrMenu-AddItem(VARIANT_FALSE, -1, RTXC_UI_TYPE_IM_THIR
12、DPARTY, ID_BENGIN_SCREEN_SHARE, &m_xMenuSink, _T(應(yīng)用程序共享), NULL, RTXC_MENU_ITEM_SEPARATOR_BELOW, 3, VARIANT_FALSE)throw RTX_UNSPECIFIC_ERROR;至此,已經(jīng)完成了向 RTX 客戶端添加菜單的功能,該插件運(yùn)行之后,會在 RTX 客戶端添加一個新的菜單項“應(yīng)用程序共享” ,如下圖: 圖 1 在主面板菜單中添加新菜單 圖 2 在用戶右鍵菜單中添加新的菜單 第 10 頁 共 20 頁圖 3 在會話窗口里添加第三方菜單完成界面體現(xiàn)之后,接下來應(yīng)該做的用戶之間的交互
13、,當(dāng)一方提出邀請另一方來進(jìn)行程序共享的時候,另一方可以選擇接受或者拒絕;這些操作都是需要用戶自己在程序中控制,并且可以采用一定的方式表現(xiàn)出來。4、交互控制、交互控制以上已經(jīng)實現(xiàn)了插件在 RTX 客戶端添加菜單的功能,用戶在點(diǎn)擊菜單的時候,就可以發(fā)起一次程序共享的邀請,具體操作的步驟如下:第一步:得到當(dāng)前選中的用戶名。在 OnQueryState 和 OnInvoke 函數(shù)中,都可以得到當(dāng)前選中的用戶名;如下代碼是在OnQueryState 函數(shù)中得到當(dāng)前選中的用戶:HRESULT CAppSharePluginModule:OnQueryState(enum RTXC_UI_TYPE UITy
14、pe, long Id, VARIANT Parameter, BSTR* Text, enum RTXC_UI_ITEM_STATE* State)if( Id = ID_BENGIN_SCREEN_SHARE)/ 在組織架構(gòu)里的用戶上的右鍵菜單中得到選中的用戶CString strSelectName;if(UIType = RTXC_UI_TYPE_ORG_STRUCT_USER)/ 得到選中的用戶名if(Parameter.vt = VT_DISPATCH)IRTXCDataCollectionPtr ptrReceivers = Parameter.pdispVal;int nCou
15、nt = ptrReceivers-Count;if(nCount 0)IRTXCDataPtr pstrRtxData=ptrReceivers-GetItem(1);long nType=pstrRtxData-GetLong(RDK_TYPE);if(nType=OBJECT_RTX_BUDDY)_bstr_t bstrUserName=pstrRtxData-GetString(RDK_VALUE);strSelectName=OLE2T(bstrUserName);else if(Parameter.vt = VT_BSTR)_bstr_t bstrUserName= Paramet
16、er. bstrVal;strSelectName=OLE2T(bstrUserName); 第 11 頁 共 20 頁/ 在 IM 窗口里的第三方菜單中得到當(dāng)前會話窗口的用戶else if(UIType = RTXC_UI_TYPE_IM_THIRDPARTY)/ 得到選中的用戶名vector vecParticipants;IRTXCSessionPtr ptrSession = Parameter.pdispVal;_bstr_t bstrParticipants = ptrSession-Participant;CString str = (LPCTSTR)bstrParticipan
17、ts;int iStart = 0;int iIndex = str.Find(_T(;);BOOL bBreak = FALSE;while(!bBreak)CString strTmpToken ;if (iIndex != -1)strTmpToken = str.Mid(iStart, iIndex - iStart);iStart = iIndex + 1;iIndex = str.Find(_T(;), iStart); elsebBreak = TRUE;strTmpToken = str.Mid(iStart, _tcslen(LPCTSTR)str)-iStart);if (
18、strTmpToken.IsEmpty()return S_OK;/ 檢查當(dāng)前用戶是否是自己if (strTmpToken.CompareNoCase(LPCTSTR)m_ptrRoot-Account) != 0)vecParticipants.push_back(strTmpToken);strSelectName = vecParticipants.at(0); 第 12 頁 共 20 頁return S_OK;第二步:設(shè)置菜單項的狀態(tài)當(dāng)選中的用戶離線的時候,菜單會變成 Disable 狀態(tài),可以在 OnQueryState 函數(shù)中設(shè)置菜單的狀態(tài),如下代碼:HRESULT CAppSha
19、rePluginModule:OnQueryState(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter, BSTR* Text, enum RTXC_UI_ITEM_STATE* State)if( Id = ID_BENGIN_SCREEN_SHARE)CString strSelectName;/ 得到選中的用戶名,如上代碼。if ( RTX_PRESENCE_OFFLINE = m_ptrRoot-Presence-RTXPresence_bstr_t(strSelectName) )/ 選中的用戶離線,菜單設(shè)置為 Disable
20、 狀態(tài)*State = RTXC_UI_ITEM_STATE_DISABLED;return S_OK;return S_OK;完成以上代碼之后,當(dāng)檢測到用戶離線的時候,可以讓“應(yīng)用程序共享”菜單項變?yōu)榛疑?,其效果如下圖所示: 第 13 頁 共 20 頁第三步:檢測對方是否安裝插件在發(fā)起邀請之前,需要檢測對方是否安裝過該插件,在響應(yīng)程序共享的菜單項的時候,向?qū)Ψ桨l(fā)送一個確認(rèn)數(shù)據(jù)包,如果對方?jīng)]有安裝插件,就會立即返回一個發(fā)送結(jié)果,根據(jù)發(fā)送的結(jié)果,可以得到對方是否安裝過插件。如下代碼:#define SCREEN_SHARE_TEST_T(ScrnShareTest)HRESULT CAppSha
21、rePluginModule:OnInvoke(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter)if(Id = ID_BENGIN_SCREEN_SHARE)CString strSelectName;/ 得到當(dāng)前選中的用戶名,代碼如上。/ 發(fā)送一個數(shù)據(jù)包給對方,測試一下對方是否存在該插件IRTXCDataPtr& ptrSendData = m_ptrRoot-CreateRTXCData();ptrSendData-SetString(SRC_SENDER, _bstr_t(LPCTSTR)m_ptrRoot-Account
22、);ptrSendData-SetString(SRC_KEY, _bstr_t(SCREEN_SHARE_TEST);m_ptrModuleSite-SendData(_bstr_t(LPCTSTR) strSelectName), ptrSendData, RTXC_SEND_DATA_FLAG_FILTERING_IS_FORBIDDEN); 第 14 頁 共 20 頁return S_OK;在發(fā)送數(shù)據(jù)包之后,會觸發(fā) evt_OnSendDataResult 事件,響應(yīng) OnSendDataResult函數(shù),如下代碼:HRESULT CAppShareModule:OnSendDataR
23、esult( RTXC_MODULE_SEND_DATA_RESULT Result, Const VARIANT* Extra)if(Result = RTXC_MODULE_SEND_DATA_RESULT_NOT_EXIST)/對方不存在本插件CString strRecverName;strRecverName = (LPCTSTR)_bstr_t(Extra-bstrVal);/ strRecverName 用戶沒有安裝插件!return S_OK;第四步:發(fā)送邀請。當(dāng)點(diǎn)擊菜單的時候,會執(zhí)行 OnInvoke 函數(shù),可以在該函數(shù)中發(fā)起程序共享的邀請,如下代碼:#define SCRE
24、EN_SHARE_CMD_INVITE_T(ScrnShareCmdInvite)#define SCREEN_SHARE_CMD_ACCEPT_T(ScrnShareCmdAccept)HRESULT CAppSharePluginModule:OnInvoke(enum RTXC_UI_TYPE UIType, long Id, VARIANT Parameter)if(Id = ID_BENGIN_SCREEN_SHARE)CString strSelectName;/ 得到當(dāng)前選中的用戶名,代碼如上。/不能給自己發(fā)起程序共享的邀請if(strSelectName = (LPCTSTR)
25、m_ptrRoot-Account)return S_FALSE/ 發(fā)送一個數(shù)據(jù)包給對方,來邀請對方接受程序共享IRTXCDataPtr& ptrSendData = m_ptrRoot-CreateRTXCData();ptrSendData-SetString(SRC_SENDER, _bstr_t(LPCTSTR)m_ptrRoot-Account); 第 15 頁 共 20 頁/ SCREEN_SHARE_CMD_ INVIT 標(biāo)識發(fā)起邀請ptrSendData-SetString(SRC_KEY, _bstr_t(SCREEN_SHARE_CMD_INVIT);m_ptrMo
26、duleSite-SendData(_bstr_t(LPCTSTR) strSelectName), ptrSendData, RTXC_SEND_DATA_FLAG_FILTERING_IS_FORBIDDEN);return S_OK;第五步:接受邀請。接受方接收到發(fā)送放的程序共享邀請之后,會觸發(fā) evt_OnDataReceived 事件,響應(yīng) OnDataReceived 函數(shù),用戶在此函數(shù)中,來處理該邀請,如下代碼:void CAppSharePluginModule:OnDataReceived(LPCTSTR Key)RTXCDataPtr& ptrData = m_pt
27、rModuleSite-GetData(Key, VARIANT_TRUE);_bstr_t& command = ptrData-GetString(SRC_KEY);/ 接收到程序共享的邀請if(command = _bstr_t(SCREEN_SHARE_CMD_INVITE)CString strSenderName;strSenderName = (LPCTSTR)ptrData-GetString(SRC_SENDER);/ 可以彈出一個自定義 TIP 的窗口,來提示用戶進(jìn)行選擇,如下圖。/ 當(dāng)用戶接受邀請,向發(fā)送方發(fā)送接受邀請的數(shù)據(jù)包IRTXCDataPtr& p
28、trSendData = m_ptrRoot-CreateRTXCData();ptrSendData-SetString(SRC_SENDER, _bstr_t(LPCTSTR)m_ptrRoot-Account);/ SCREEN_SHARE_CMD_ACCEPT 標(biāo)識接收邀請ptrSendData-SetString(SRC_KEY, _bstr_t(SCREEN_SHARE_CMD_ACCEPT);m_ptrModuleSite-SendData(_bstr_t(LPCTSTR) strSenderName), ptrSendData, RTXC_SEND_DATA_FLAG_FILT
29、ERING_IS_FORBIDDEN);下圖是一個自定義的對話框 TIP,當(dāng)用戶接收到邀請的時候,會在右下角彈出這個 TIP讓用戶進(jìn)行選擇接受和拒絕。 第 16 頁 共 20 頁5、收發(fā)數(shù)據(jù)處理、收發(fā)數(shù)據(jù)處理程序共享的網(wǎng)絡(luò)傳輸是采用兩種傳輸方式:RTX 傳輸通道和 P2P 通道;這兩種方式同時存在,傳輸數(shù)據(jù)量比較小的命令和控制信息,采用 RTX 傳輸通道來實現(xiàn),這樣可以實現(xiàn)安全和穩(wěn)定的傳輸;針對數(shù)據(jù)量比較大的屏幕壓縮數(shù)據(jù)和鼠標(biāo)位置信息等,將采用 P2P 傳輸,這樣的傳輸高效,占用的資源比較少。RTX 傳輸通道的使用方式,是通過m_ptrModuleSite-SendData()來實現(xiàn)發(fā)送數(shù)據(jù),
30、當(dāng)接收到數(shù)據(jù)的時候,會響應(yīng) OnDataReceived 函數(shù),其具體操作,可以參看“交互控制”部分的描述;在此,主要說明 P2P 通道的使用,其步驟如下:第一步:創(chuàng)建 P2P 通道管理器。在 AppSharePluginModule.h 文件中添加 P2P 通道管理接口指針的定義:IP2PMgrExPtrm_ptrP2PMgrEx;CRTXP2PExEvent*m_P2MgrExEventSink;typedef map MAP_P2PCHANNEL_SEQ;MAP_P2PCHANNEL_SEQm_mapP2PChannelSeq;/ 定義一個接受者CStringm_strRecvName;
31、/ P2P 通道的事件響應(yīng)函數(shù)void OnCreateResult(LONG nSeq,BSTR pAccount,LONG nError);void OnRecv(LONG nSeq,BYTE * pData, LONG DataLen);void OnSend(LONG nSeq, LONG nResult);在 AppSharePluginModule.cpp 文件中的 OnLoginResult 函數(shù)中實現(xiàn)對該指針的初始化:HRESULT CAppSharePluginModule:OnLoginResult(RTXC_LOGIN_RESULT Result)RTX_TRYif(Re
32、sult = RTXC_LOGIN_RESULT_OK) 第 17 頁 共 20 頁/ 登陸成功,初始化 P2P 通道m(xù)_ptrP2PMgrEx = NULL;m_ptrP2PMgrEx = m_ptrRoot-CreateP2PMgr();if(m_ptrP2PMgrEx != NULL & m_ptrRoot != NULL)m_ptrP2PMgrEx-Init(m_ptrRoot);m_ptrP2PMgrEx-SetVerify(_bstr_t(_T(p2p_appshare);m_P2PMgrExEventSink = CRTXP2PExEvent:CreateObject()
33、;if(m_P2PMgrExEventSink) m_P2PMgrExEventSink-evt_OnRecv.bind(this,&CAppSharePluginModule:OnRecv); m_P2PMgrExEventSink-evt_OnCreateResult.bind(this,&CAppSharePluginModule:OnCreateResult); m_P2PMgrExEventSink-evt_OnSend.bind(this,&CAppSharePluginModule:OnSend); if (!m_P2PMgrExEventSink-Adv
34、ise(m_ptrP2PMgrEx) throw RTX_UNSPECIFIC_ERROR; RTX_CATCH_ALL(return E_FAIL);return S_OK;在 AppSharePluginModule.cpp 文件中添加事件響應(yīng)函數(shù):/ 返回創(chuàng)建通道的結(jié)果void CAppSharePluginModule:OnCreateResult(LONG nSeq,BSTR pAccount, LONG nError) / 返回發(fā)送數(shù)據(jù)的結(jié)果void CAppSharePluginModule:OnSend(LONG nSeq, LONG nResult) / 接收到 P2P 通道
35、的數(shù)據(jù)void CAppSharePluginModule:OnRecv(LONG nSeq, BYTE *pData, LONG DataLen) 第 18 頁 共 20 頁第二步:創(chuàng)建一個 P2P 通道。在程序共享發(fā)起方接收到對方接受邀請的命名之后,發(fā)起方會跟接受方建立一個 P2P通道,在 OnDataReceived 函數(shù)中實現(xiàn)創(chuàng)建 P2P 通道,如下代碼:void CAppSharePluginModule:OnDataReceived(LPCTSTR Key)RTXCDataPtr& ptrData = m_ptrModuleSite-GetData(Key, VARIANT
36、_TRUE);_bstr_t& command = ptrData-GetString(SRC_KEY);/ 接收到程序共享的邀請if(command = _bstr_t(SCREEN_SHARE_CMD_INVITE)/ 代碼如上。./ 對方接受了發(fā)起方的邀請else if(command = _bstr_t(SCREEN_SHARE_CMD_ACCEPT)CString strSenderName;strSenderName = (LPCTSTR)ptrData-GetString(SRC_SENDER);/ 開始建立 P2P 通道if(m_ptrP2PMgrEx)m_ptrP2P
37、MgrEx-Create(_bstr_t(LPCTSTR) strSenderName);在創(chuàng)建 P2P 之后,需要去捕獲 OnCreateResult 事件,得到當(dāng)前創(chuàng)建 P2P 通道的結(jié)果,可以在如下函數(shù)中得到創(chuàng)建的 P2P 通道的序列號,該序列號可以唯一的標(biāo)識一個 P2P 通道,如下代碼:/ 返回創(chuàng)建通道的結(jié)果void CAppSharePluginModule:OnCreateResult(LONG nSeq,BSTR bstrAccount, LONG nError) CString strAccount(bstrAccount);if(nError)/ 當(dāng)前創(chuàng)建的 P2P 通道成功!把該通道的序列號保存在 m_mapP2PChannelSeq 中strAccount.MakeLower();m_mapP2PChannelSeqstrAccount = nSeq;m_strRecvName = strAccount; 第 19 頁 共 20 頁else/ 創(chuàng)建 P2P 通道失??!第三步:使用 P2P 通道。使用 P2P 通道來實現(xiàn)發(fā)送數(shù)據(jù),如下程序代碼:/ 發(fā)送程序共享數(shù)據(jù)包v
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 節(jié)能減排:環(huán)保型廠房股權(quán)轉(zhuǎn)讓與能源優(yōu)化協(xié)議
- 物流倉儲租賃及管理服務(wù)協(xié)議
- 住宅小區(qū)場地安全維護(hù)合同
- 餐飲行業(yè)總經(jīng)理全面授權(quán)與管理合同
- 汽車展場地推廣與汽車廠商合作協(xié)議
- 人工智能背景下的智慧規(guī)劃建設(shè)實踐與思考
- 城市CIM平臺建設(shè)賦能數(shù)字發(fā)展
- 美術(shù)素描說課課件
- 美術(shù)電影課件
- 美術(shù)班主題班會課件
- 四年級閱讀訓(xùn)練概括文章主要內(nèi)容(完美)
- YY/T 0995-2015人類輔助生殖技術(shù)用醫(yī)療器械術(shù)語和定義
- GB/T 37234-2018文件鑒定通用規(guī)范
- 高中英語讀后續(xù)寫教學(xué)策略的探究
- 2023年鹽城市阜寧縣人民醫(yī)院醫(yī)護(hù)人員招聘筆試題庫及答案解析
- 2022年動畫制作行業(yè)分析及未來五至十年行業(yè)發(fā)展報告
- 畢業(yè)論文答辯
- 染缸操作規(guī)范
- 可下載打印的公司章程
- 1p120新產(chǎn)品制造可行性報告
- 工程結(jié)算審核定案表(模板)
評論
0/150
提交評論