




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、哈尔滨工业大学计算机学院唐好选Email:COM组件技术组件技术主要内容主要内容pCOM发展历史及其基本原理p构件对象模型COM/DCOMpCOM构件的开发与应用COM发展历史及其基本原理p COM是微软提出的第一个构件模型,源于OLE: Object Link and Embedding(对象连接与嵌入)p OLE1 采用DDE(Dynamic Data Exchange:动态数据交换)技术 在不同的程序之间进行通信p DDE缺点: 建立在Windows消息机制基础上,效率低、稳定性不好、使用不方便 p COM是为克服上述不足而出现的 COM 技术的发展技术的发展p COM定义了客户与构件之
2、间互操作的标准,包括规约与实现两个部分p 规约部分定义了构件之间的通信机制,不依赖于任何特定的语言和操作系统p 实现部分就是COM库,为COM规约的具体实现提供了核心服务p COM仅支持同一台计算机上(Windows操作系统)的互操作,不支持分布式计算环境COM 技术的发展技术的发展p 将COM技术延伸到分布计算环境,产生了所谓的DCOM (Distributed COM,分布构件对象模型)p 用网络协议 代替 本地进程之间的通信p 针对分布式环境提供了新特性:位置透明;网络安全性以及跨平台调用等p 为了满足企业级应用的需求,推出了微软事务服务器 (MTS: Microsoft Transac
3、tion Server),把应用系统的客户程序、应用构件和各种资源有机结合起来,为分布式企业应用提供了一种服务器端的构件运行和部署环境COM 技术的发展技术的发展p 为了使Windows真正成为企业应用平台,微软推出了分布式网络应用体系结构(Windows DNA: Distributed interNet Application Architecture),DNA是一个完整的、多层的企业应用体系结构:包含工具、数据库、操作系统、编程模型和应用服务等p 随着Win 2000发布,微软进一步把COM、DCOM、MTS统一起来,形成了真正适合于企业级应用的构件技术:COM+p 可以认为:COM/D
4、COM + MTS = COM+p COM+是一种中间件技术规约,提供操作系统级的分布式“服务”COM 技术的发展技术的发展Window DNAp DNA是一个服务器端的开发平台,包括p Windows 系统 提供运行环境和支持p COM/DCOM/COM+ p MSMQ 消息队列产品,支持构件间异步通信p MTS 管理构件的应用服务p Microsoft Wolfpack 支持集群服务器的软件p Microsoft SQL Server p Microsoft IIS Web服务器p Microsoft Management Console 部署和管理工具Window DNACOM+基本结构
5、基本结构COM+目录负载平衡驻留内存数据库对象池新的事件模型构件管理和部署JIT激活COM+ MTS事务支持资源分发管理安全模型易于管理远程支持 DCOM分布式构件服务 COM基于接口的编程模型基本的构件服务pCOM(Component Object Model),组件对象模型,是一种以组件为发布单元的对象模型,这种模型使得各个软件组件可以用一种统一的方式进行交互pCOM是一种协议,它建立了一个软件模块同另一个软件模块之间的连接,提供了组件之间进行交互的规范,也提供了实现交互的环境p当这种连接建立起来后,两个模块之间就可以通过“接口”的机制来进行通讯,这些接口既不需要静态的或动态的连接入口点,
6、也不需要编码很复杂的地址什么是什么是COM?p全局唯一标识符(Global Unique IDentifier)来源于OSF的通用统一标识符UUID(Universal Unique IDentifier),是一个128位整数pGUID的作用p用于标识COM对象(CLSID)和接口(IID)p空间足够大, 冲突较小,可用编程方法生成唯一GUID pVC: UUIDGEN.EXE, GUIDGEN.EXEp对GUID值的传递通常通过引用进行COM基本概念:基本概念:GUID基本概念:基本概念:COM对象对象/COM构件构件/COM接口接口COM构件对象1对象2接口1接口2 接口3接口4基本概念:
7、基本概念:COM对象和对象和COM构件构件pCOM对象是指符合COM规则的CoClass(构件类)的实例,每一个COM对象都有一个GUID,称为CLSID(CoClassID)pCOM构件是指以编译后的形式提供一组功能的COM对象p独立于具体编程语言p一个构件可以由多个类实现p以二进制形式(DLL或EXE)发布p可以在不妨碍客户的形式下被升级p可以透明地在网络上被重新分配pCOM接口是COM规范的核心内容,是COM对象显示出来的所有信息,是一组逻辑上相关的函数集合p每一个接口都有一个GUID,称为接口标识符(简称IID:Interface IDentifier)pCOM接口具有不变性,只允许单
8、继承p一个COM对象可以实现多个接口,这体现了COM对象的多态性,这些接口由IUnknown接口来管理p在C+中,可以用抽象基类来定义COM接口基本概念:基本概念:COM接口接口 新版本构件的处理新版本构件的处理pCOM接口永远不会变化 :一个IID就是一个接口,当对组件进行升级时,一般不会修改已有的接口,而是加入一些新接口p当下列条件中的任何一个变化时,应给新接口指定新IIDp接口中函数数目p接口中函数顺序p某个函数的参数p某个函数参数的顺序p某个函数参数的类型p函数可能的返回值p函数返回值的类型等p不同版本接口的命名:在原名称后加一个数字p是所有COM对象都必须实现的接口,其它接口都直接或
9、间接继承IUnknown(IID为00000000-0000-0000-C000-000000000046 )接口,包含三个基本操作pAddRef:提供生存周期管理功能,增加对象引用计数pRelease:提供生存周期管理功能,用于释放对象pQueryInterface:负责向客户提供接口查询功能基本概念:基本概念:IUnknown接口接口IUknown接口的定义,定义在接口的定义,定义在win32 SDK中的中的UNKNWN.h头文件中:头文件中:interface IUnkown virtual HRESULT _stdcall QueryInterface( const IID&,
10、 void *ppv) = 0; virtual ULONG_stdcall AddRef() = 0; virtual ULONG_stdcall Release() = 0; pMIDL(Microsoft Interface Definition Language)是定义COM接口的描述性语言,通过独立于具体编程语言的方式来定义接口,该语言基于OSF分布式计算环境(DCE)远程过程调用(RPC)的接口描述语言IDLpCOM规范使用的IDL接口描述语言不仅可用于COM接口,同时还定义了一些常用的数据类型,也可描述自定义的数据结构,对于接口的成员函数,可以指定每个参数的类型、输入输出特性,甚
11、至可支持变长度的数组的描述pMIDL支持指针类型,与C/C+类似基本概念:接口定义语言基本概念:接口定义语言p接口定义例:interface IDictionary HRESULT Initialize(); HRESULT LoadLibrary(in string); HRESULT InsertWord(in string, in string); HRESULT DeleteWord(in string); HRESULT LookWorld(in string,out string*); HRESULT RestoreLibrary(in string); HRESULT FreeL
12、ibrary();基本概念:接口定义语言基本概念:接口定义语言pCOM接口是一个二进制标准,客户同接口的连接并不是通过其名称或其成员函数的名称来实现的,而是通过其在内存块中的位置完成的pCOM接口是包含一个函数指针数组的内存结构,每一个数组元素包含一个由组件所实现的函数的地址pC+通过纯抽象基类实现COM接口,实际上是定义了一个内存块的结构,但此内存只是在派生类中实现此抽象基类时才会被分配,派生类继承此抽象基类时将继承此内存结构COM接口接口Vtbl指针指针虚拟函数虚拟函数表表pIXIX&Fx1&Fx2&Fx3&Fx4虚拟函数表虚拟函数表pCOM接口的内存结构同
13、C+编译器为抽象基类所生成的内存结构是相同的,对于如下利用纯抽象基类方式定义的接口interface IX virtual void _stdcall Fx1()=0; virtual void _stdcall Fx2()=0; virtual void _stdcall Fx3()=0; virtual void _stdcall Fx4()=0; p提高接口实现的灵活性,实现抽象基类的类可能会将特定于实例的信息同vtbl一块保存例子:一个实现接口IX的类CA,CA包含2个数据:class CA : public IX public: virtual void_stdcall Fx1()
14、virtual void_stdcall Fx2() virtual void_stdcall Fx3() virtual void_stdcall Fx4() double Data1; double Data2;Vtbl的作用的作用Vtbl指针指针虚拟函数表虚拟函数表IX&Fx1&Fx2&Fx3&Fx4Data1Data2pAFx1Fx2Fx3Fx4CA实例数据和实例数据和vtbl一起保存一起保存p注意:COM组件决不会访问任何实例数据,在COM中,对一个组件的访问只能通过函数完成,绝不能直接通过变量p纯抽象基类只有虚拟函数,没有实例数据两个实例两个实例 共
15、享同一共享同一VtblVtbl指针指针虚拟函数表虚拟函数表&Fx1&Fx2&Fx3&Fx4Data1Data2pA1pA2Fx1Fx2Fx3Fx4CAVtbl指针指针Data1Data2共享同一共享同一VtblVtbl指针指针虚拟函数表虚拟函数表IXQueryInterfaceAddRefRelease&FxpAQueryInterfaceAddRefReleaseFxCAp所有COM接口都必须继承IUnknown接口,支持其定义的三个函数,而且必须是接口vtbl的前三个函数Vtbl与与Iunknown接口接口pIUnknown * CreateInst
16、ance();创建构件时,客户可以使用CreateInstance,而不是newpCreateInstance的定义: IUnknown * CreateInstance() IUnknown * pI = static_cast (new foo); pI - AddRef(); return pI; IUnknown指针的获取指针的获取p一个COM对象(构件)可以实现多个接口p使用QueryInterface查询某个构件是否支持某个特定的接口 void foo(Iunknown * pI)IX * pIX = NULL;HRESULT hr = pI-QueryInterface(IID_
17、IX, (void *)&pIX);If (SUCCEEDED(hr) pIX-Fx(); 接口查询接口查询pQueryInterface返回的总是同一个IUnknown指针p若客户曾经获取过某个接口,那么它将总能获取此接口p客户可以再次获取已经拥有的接口p客户可以返回到起始接口p若能够从某个接口获取某特定接口,则可以从(该构件的)任意接口获取此接口QueryInterface的实现规则的实现规则p 通过函数AddRef与Release实现p 控制构件的生命期p 解决内存管理问题p 使构件能够自己将自己删除p 使用规则p 返回接口指针之前调用AddRef;p 使用完接口之后调用Rele
18、ase;p 赋值之后调用AddRef;引用计数引用计数在什么层次上进行计数:构件在什么层次上进行计数:构件?对象对象?接口接口?构件构件构件引用记数构件引用记数对象引用记数对象引用记数对象引用记数对象引用记数对象对象1对象对象2接口接口接口接口接口接口接口接口接口引用记数接口引用记数接口引用记数接口引用记数接口引用记数接口引用记数接口引用记数接口引用记数引用计数的实现方式引用计数的实现方式p 函数的参数中使用接口指针变量p 对于输入参数,被调函数不必改变计数p 对于输出参数,相当于生成了一个新的接口指针变量,因此在返回之前,需要使计数增1p 对于输入输出参数,参数修改之前计数减1,修改之后计数
19、加1,若参数未被修改,计数不变p 对于局部接口指针变量,不改变计数p 对于全局接口指针变量,作为参数传给某函数之前,计数增1,返回之后计数减1,C+类成员变量为接口指针变量时也采用此规则引用计数的更详细的规则引用计数的更详细的规则构件对象模型COM/DCOMpCOM构件可以和客户机程序在同一个进程中,也可以在不同的进程中p前者称为进程内构件(INPROC_SERVER)p后者称为进程外构件(LOCAL_SERVER )p如果是DCOM,进程外构件还包括pCLSCTX_REMOTE_SERVER COM构件与客户机之间的通信机制构件与客户机之间的通信机制p在Windows平台上,进程内构件以动态
20、链接库(DLL)形式实现p由于DLL包含一个导出函数表,客户机程序和DLL动态连接时会建立一张表,把客户机调用和DLL中函数的地址连接起来 因此客户机程序和进程内构件可通过直接函数调用进行交互p进程内构件程序也可称作进程内服务程序COM构件与客户机之间的通信机制构件与客户机之间的通信机制p对于进程外构件,由于进程之间相互屏蔽,客户机进程不能直接调用构件进程,需要遵循操作系统对进程间通信所做的规定,在Windows平台上,进程外构件以EXE实现,COM采用本地过程调用(LPC)作为进程间通信机制COM构件与客户机之间的通信机制构件与客户机之间的通信机制客户机进程客户机应用进程内构件进程内对象CO
21、M本地对象代理服务器进程COM本地对象代理COM桩LPCp当调用组件的时候,其实是依靠代理(运行在本地)和存根(运行在远端)之间的通讯完成的组件调用机制pCOM不仅定义了客户与构件之间交互的规约,而且提供了全面的实现细节,COM的实现与操作系统密切相关,包括:pCOM库(COM Library)p系统注册表(windows registry)p类工厂pCOM服务器COM的实现的实现p 是COM标准的系统级实现,为COM对象的标识和创建、内存管理、构件程序的卸载等提供了一组标准接口和辅助函数p COM库主要包含在OLE32.dll、OLE32.lib和RPCSS.dll文件中p COM库很多地方
22、直接用到了Windows系统的特性,例如系统注册表和动态链接库,COM通过注册表查找本地服务器(即EXE程序) 以及程序名与CLSID的转换 COM库库pCOM库中常用的函数p 初始化函数p 与GUID相关的函数p 对象创建函数p 内存管理函数关于关于HRESULTp组件API及接口指针中,除了pIUnknown:AddRef()pIUnknown:Release()两个函数外,其它所有的函数,都以 HRESULT 作为返回值 pHRESULT 是一个双字节的值p最高位0表示成功p最高位1表示错误Windows 注册表注册表p系统注册表是全操作系统公用的信息仓库,可用作客户程序、构件程序和CO
23、M库三者交换有关COM对象信息和接口信息的场所pWindows操作系统的系统注册表中包括硬件、软件、配置及用户等各种信息p由REGEDIT.EXE启动p由REGSVR32.EXE来注册某个构件p系统注册表是一个由许多元素构成的层次结构,每个元素均被称作一个关键字,每个关键字可以包含一系列子关键字p例如: HKEY_CLASSES_ROOTCLSIDProgID 等通过通过Windows 注册表注册组件注册表注册组件p 注册文件注册文件 REGEDIT4 HKEY_CLASSES_ROOTTEST =“TESTCOM HKEY_CLASSES_ROOTTESTCLSID =b91c46bc-58
24、41-4f41-95f3-daade42b3436组件注册其它方法组件注册其它方法p情况1:当使用 ATL(Active Template Library) 编写组件程序,编译成功后,IDE 自动完成注册;p情况2:当写了一个具有 COM 功能的 EXE 程序时,运行一次该程序即可完成组件注册p情况3:当需要使用第三方提供的组件程序时,可通过命令行运行“regsvr32.exe 文件名”来注册,反注册的方法是“regsvr32.exe /u 文件名”; 关于注册组件关于注册组件p情况4:当需要在程序中(如安装程序)执行注册,那么: typedef HRESULT (WINAPI * FREG)
25、(); TCHAR szWorkPath MAX_PATH ; :GetCurrentDirectory( sizeof(szWorkPath), szWorkPath ); :SetCurrentDirectory( 组件目录 ); HMODULE hDLL = :LoadLibrary( 组件文件名 ); if(hDLL) FREG lpfunc = (FREG):GetProcAddress( hDLL, _T(DllRegisterServer) ); if ( lpfunc ) lpfunc(); :FreeLibrary(hDLL); :SetCurrentDirectory(sz
26、WorkPath);p 类工厂是能够创建其它COM对象的特殊COM对象,类工厂支持一个特殊的接口IClassFactory,为例化CoClass构件类提供了一种标准机制p 每一个COM对象类应该有一个相应的类工厂对象p IClassFactory接口中定义了两个重要的操作p CreateInstance:生成COM对象并返回所请求接口的指针p LockServer:负责在内存中保持COM构件类工厂类工厂类工厂类工厂(Class Factory)(Class Factory)p如果使用类厂,CoCreateInstance实际上未直接创建COM构件,而是创建了一个被称为类厂的构件,类厂构件的唯一
27、功能是创建其他构件p客户可以通过类厂所支持的接口来对类厂创建构件的过程加以控制pCoCreateInstance首先调用CoGetClassObjec获取类厂中的IClassFactory接口的指针p然后使用返回的指针调用IClassFactory:CreateInstance完成新组件的创建组件创建过程组件创建过程客户COM库DLL类厂组件CoCreateInstanceCoGetClassObjectDllGetClassObjectNew CFactoryIClassFactory:CreateInstance(IID_IX)New CAIClassFactory:ReleasepIX-
28、Fx()p 是指包含一个或多个COM对象类和相应的类工厂,能向客户提供服务的一个程序(EXE)或库(DLL)COM服务器服务器客户机 构件 类对象对象COM库系统注册表CLSID SERVER.DLL1.客户调用CoGetClassObject2.COM定位所请求的类对象3.构件被启动4.类对象创建成功后将IClassFactory接口指针经COM库返回给客户机5.客户调用IClassFactory创建实例7.接口将指针返回给客户机6.对象被创建COM的复用方式的复用方式pCOM不允许直接继承,但可通过包含和聚合来代替继承p如果一个构件B使用另外一个构件A,我们称使用者B为外部构件,被使用者A
29、为内部构件, 则称:外部构件B包含(聚合)了内部构件Ap包含与聚合是COM的两种复用方式(模型),为系统升级和扩展提供支持包含包含(Containment)对象对象A对象对象BIYIXIXIUnknownp对象B的成员函数在调用对象A的接口之前或之后可以进行其他任何操作pIX 提供的功能可以超过IXp对象B是对象A的客户,而对象B的客户看到的只是对象B显露出的接口(IY和IX)p对象A的创建与释放完全在对象B内部进行,对象A的生命期包含在对象B的生命期内包含包含(Containment)聚合聚合 (Aggregation)对象对象A对象对象BIYIXIUnknownIUnknown聚合聚合 (
30、Aggregation)客户程序对象B对象A调用传递ISomeInterfaceIOtherInterfacep聚合可看作是包含的一个特例,聚合更好地体现了复用p虽然对象A直接向对象B的客户提供服务,但对象B的客户感觉不到对象A的存在,对象A的生存期受到对象B的控制p实现聚合的关键在于QueryInterfacep当客户向对象B请求IX时,对象B的QueryInterface返回对象A的IX指针p存在问题:(1)从IX如何得到IY?(2)从IX得到的Iunknown如何与从IY得到的IUnknown 相同?聚合聚合 (Aggregation)(Aggregation)p包含的复用性建立在客户/
31、服务器模式上,而聚合的复用性需要内部构件提供支持p复用方式的选择:p当内部构件提供的接口完全满足要求时,使用聚合p当内部构件提供的接口与需求类似时,使用包含p在一个对象中可以同时使用两种复用方式包含与聚合的使用包含与聚合的使用p 自动化是允许高级语言使用构件的COM应用技术,自动化的核心是IDispatch接口,自动化对象就是实现了IDispatch接口的COM对象p IDispatch接口是自动化对象必须实现的接口, IDispatch在IUnkown接口的基础上增加了如下操作p GetIDsOfNames 操作负责返回操作或属性及其参数名字的分发标识符(分发ID,即DISPID:用于管理属
32、性和操作)p GetTypeInfo 处理对象类型信息p GetTypeInfoCount 处理对象类型信息p Invoke 是IDispatch的核心操作,根据分发ID执行相应函数COM的动态激活机制的动态激活机制-自动化自动化COM的动态激活机制的动态激活机制-自动化自动化构件构件客户机客户机IDispatch指针对象对象Vtable指针IDispatch VtableInvokeInvoke(DISP d,) Switch(d)Case 1: Method1();Case 2: Method2()Method2() Method1() p Invoke操作和分发ID机制使得运行时动态绑定
33、属性和方法成为可能,但灵活性的代价是效率的降低。如果将DISP进行硬编码而不频繁调用GetIDsofNames(即早绑定),效率会大大提高,IDL中用disinterface支持硬编码p 对象描述语言ODL是对IDL的扩充,用来描述COM对象的类型信息,包括接口的类型信息(interface或disinterface)和COM对象类的类型信息(用coclass关键字描述)p 类型库是IDL文件经过编译后产生的一个资源文件,包含COM服务器中COM对象和接口的信息p IDL用library描述类型库信息,包括类型库的全局唯一标识符(LIBID)、类型库所使用的版本、语言等COM的动态激活机制的动
34、态激活机制-自动化自动化COM的动态激活机制的动态激活机制-自动化自动化p 自动化组件可以被脚本语言直接调用,也称为双接口组件p DCOM是COM的进一步扩展,DCOM用网络协议来代替本地进程之间的通信,并针对分布环境提供了一些新的特性,如:位置透明、网络安全性、跨平台调用等p DCOM的分布特性依靠远程过程调用实现分布构件对象模型分布构件对象模型DCOM客户机COM运行时环境安全提供者 DCE RPC协议栈COM运行时环境安全提供者 DCE RPC协议栈构件DCOM网络协议网络协议COM组件开发与应用p基于COM组件开发可简要描述为以下几个过程p建立COM组件p基于ATL编程p基于MFC编程
35、(可用于实现自动化组件)p编译组件p注册组件p编写客户端程序,调用组件的接口函数COM组件的开发与应用组件的开发与应用 过程过程p 组件调用的方法主要分为以下几种组件调用的方法主要分为以下几种:p #include方法 IDL编译后,产生xxx.h和xxx_i.c文件: #include “ComTest.h #include “ComTest_i.c“ 如用到CComBSTR,还需要包含:#include p #import方法 IDL编译后,产生xxx.tlb文件,#import “ComTest.tlb“客户端程序客户端程序-组件调用组件调用 #include ComTest.h#inc
36、lude ComTest_i.c :CoInitialize( NULL ); IUnknown * pUnk = NULL; IFun * pFun = NULL; HRESULT hr; hr = :CoCreateInstance(CLSID_Fun,NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID *) &pUnk); if( FAILED( hr ) )throw( _T(“组件没注册!) ); hr = pUnk-QueryInterface(IID_IFun,(LPVOID *)&pFun ); if( FAILE
37、D( hr ) )throw( _T(没有接口?) ); hr = pFun-Add( 1, 2, &nSum ); /调用组件函数组件调用组件调用-简单调用简单调用1 #include ComTest.h#include ComTest_i.c :CoInitialize( NULL ); IFun * pFun = NULL; HRESULT hr; hr = :CoCreateInstance(CLSID_Fun,NULL, CLSCTX_INPROC_SERVER,IID_IUnknown, (LPVOID *) & pFun ); if( FAILED( hr ) )
38、throw( _T(“组件没注册或 没有接口!) ); hr = pFun-Add( 1, 2, &nSum ); /调用组件函数 :CoUninitialize();组件调用组件调用-简单调用简单调用2 #include ComTest.h#include ComTest_i.c“ :CoInitialize( NULL ); CComPtr spUnk; CComPtr spFun; HRESULT hr; hr = spUnk.CoCreateInstance( CLSID_Fun ); if( FAILED( hr ) ) throw( _T(没注册组件) ); hr = sp
39、Unk.QueryInterface( &spFun ); if( FAILED( hr ) ) throw( _T(没有接口) ); hr = spFun-Add( 1, 2, &nSum );组件调用组件调用-指针调用指针调用1#include ComTest.h#include ComTest_i.c CComPtr spUnk;/ 定义 IUnknown 的智能指针 CComQiPtr spFun;/ 定义 IFun 的智能指针 HRESULT hr; hr = spUnk.CoCreateInstance( L“ComTest.Fun.1 ); if( FAILED( hr ) ) throw( _T(没注册组件) ); spFun = spUnk; if(!spFun) throw( _T(没有接口) ); hr = spFun-Add( 1, 2, &nSum );组件调用组件调用-指针调用指针调用2#include ComSimple.h#include ComSimple_i.c CComQIPtr spFun; / 定义 IFun 的智能指针 HRESULT hr; hr = spFun.CoCreateInstance( LSimple1.fun.1 ); i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海现代化工职业学院《大学生职业生涯与发展规划》2023-2024学年第二学期期末试卷
- 桂林旅游学院《普通话与教师口语》2023-2024学年第二学期期末试卷
- 长春医学高等专科学校《信息检索竞赛》2023-2024学年第一学期期末试卷
- 四川省内江市2025年五下数学期末经典试题含答案
- 河南省郑州市金水区评价2025年三年级数学第二学期期末监测模拟试题含解析
- 重庆医药高等专科学校《听力障碍儿童心理与教育》2023-2024学年第二学期期末试卷
- 贵州毕节市威宁县第八中学2024-2025学年高三下-等级考调研(二模)语文试题试卷含解析
- 电子科技大学成都学院《影视非线性编辑》2023-2024学年第二学期期末试卷
- 湖南长沙市岳麓区重点达标名校2025届初三第三次模拟考试试题化学试题含解析
- 汝州市2024-2025学年五下数学期末质量检测模拟试题含答案
- 自然辩证法期末考试打印版
- 《清涧之旅》课件
- 苏洵《六国论》与苏轼《六国论》、苏辙《六国论》比较阅读(附答案解析与译文)
- (1.27)-发扬中国革命道德
- 项目三 电子线路安装与调试
- 人体工程学因素识别评价改善程序(含表格)
- 教科版二年级科学下册第二单元我们自己复习课件
- 2023年考研考博-考博英语-陕西师范大学考试历年高频考点真题答案
- 汉字的起源适合小学生
- 普通心理学(第六版)
- 卫健系统深入开展矛盾纠纷“大走访、大排查、大化解”专项行动工作方案
评论
0/150
提交评论