ArcEngine开发个人手册范本_第1页
ArcEngine开发个人手册范本_第2页
ArcEngine开发个人手册范本_第3页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章ArcEngine介绍第二章ArcEngine结构一、ArcEngine包含的主要库文件1、System库ArcGIS结构中最底层的库,包含为其它库提供服务的组件。2、SystemUI包含为用户界面组件在ArcEngine中可以进行扩展定义的接口,包括:ICommand,ITool,和ItoolControl接口。3、Geometry处理存储在要素类或其它图形元素中的几何图形要素。我们经常遇到的基本几何目标有Point,MultiPoint,Polyline和Polygon4、Display包含显示地理数据的像,如:symbols,colors等。我们通常通过类似Map或PageLayo

2、ut对像提供的视图view来访问Display5、Server包含用来连接到ArcGISServers的对像。我们可以通过GISServerConnection对象访问ArcGISServer。6、Output用来将图形输出到设备上,如printers、plotters和hardcopyformats如:EMF,JPG,BM隽。可扩展7、GeoDatabase为geodatabase提供API函数。可以扩展以支持特定数据格式Features,Classes,etcetera,可通过PlugInDataSource对象加入自定义的矢量数据源。Geodatabase支持的本地数据类型无法扩展8、G

3、ISClient用来接受ArcIMS和ArcGISServer.提供的网络服务。9、DataSourcesFile包含以文件为数据源的shapefile,coverage,TIN,CAD,SDC,StreetMap,andVPF部分GeoDatabaseAPI函数的实现。10、DataSourcesGDB包含以数据库为数据源MicrosoftAccess、ArcSDEIBMDB2,Informix,MicrosoftSQLServer,andOracle部分GeoDatabaseAPI函数的实现。11、DataSourcesOLEDB包含以MicrosoftOLEDB为数据源的部分GeoDat

4、abaseAPI函数的实现。该库文件只在MicrosoftWindows操作系统上存在。12、DataSourcesRaster包含以栅格数据为数据源的部分GeoDatabaseAPI函数的实现。13、GeoDatabaseDistributed为企业geodatabase提供数据输入输出工具14、Carto创建和显示地图。15、Location包含支持地理编码和处理路径事务有关的对象16、NetworkAnalysis提供populating包含网络数据的地理数据库和网络分析的对象。17、Controls用来借助ArcGIS功能创建或扩展应用程序。它通过封装ArcObjects和提供一组上层

5、coarsergrained的APE函数简化了开发过程。虽然,它封装了底层finegrained的ArcObjects,但并没有限制对其访问。其中MapControl和PageLayoutControl分别封装了Carto库的Map和PageLayout对象。ReadControl同时封装了Map和PageLayout对象,并且提供了简单的API函数。如果地有图发布授权,开发人员可以访问部对象,如同访问Map和PageLayout控件。该库还包含了实现容表atableofcontents的TOCControl控件和实现主要hosting命令与工具的ToolbarControl控件。开发人员可以

6、使用这些控件创建自己的命令和工具来扩展该库。Controls库中的HookHelper对象支持扩展。18、GeoAnalyst包含支持核心空间分析功能的对象。这些功能在SpatialAnalyst和3Danalyst库中都使用到。19、3Danalyst包含3DScenes中运行的对象,就像Carto库中包含2Dmaps中的对象。20、GlobeCore包含操作globe数据的对象。21、SpatialAnalyst包含对栅格和适量数据进行空间分析的对象。第三章使用ArcGIS控件开发应用程序第一节使用ArcGIS控件一、ArcGIS控件介绍ArcGIS控件是一组高级开发组件,首先可以让开发人

7、员利用ArcGIS功能建立和扩展应用程序,然后是提供一个用户界面。包含下列控件:MapControlsimilartothe'data'PageLayoutControlToolbarControlTOCControl<TableofContentsControl>SceneControlGlobeControlReaderControl有两种方法使用这些控件来创建应用程序:1、将控件嵌入到已有程序中,使其具有地理信息功能;2、使用控件创建单独的应用程序。不管使用哪种方法,单独的ArcGIS控件都可以嵌入到一个应用程序或TOCControl中,并且ToolbarCo

8、ntrol可以用来与另外一个ArcGIS控件协作以提供应用程序框架部分。二、使用ArcGIS控件为了使用ArcGIS控件有效地创建应用程序,我们首先必须弄清一些对所有控件都适用的一般性问题和概念。1、可嵌入式组件<EmbeddableComponents>2、属性页面<PropertyPages>3、ArcObjects每个ArcGIS控件都通过封装coarsegrainedArcObjects仍然可以访问finergrainedArcObjects简化了开发过程。例如,pageLayoutControl封装了PageLayout对象,PageLayou包含至少一种Ma

9、pFrame元素,MapFrame包含一个Map,Map可以包含多个栅格raster,要素feature,或自定义的Layer对象。每个ArcGIS控件都为封装了ArcObjects中使用频繁的属性和方法提供了快捷方式。例如,MapControl的SpatialReference属性,就是Map对象的SpatialReference属性的快捷方式。每个ArcGIS控件还有执行普通任务的帮助方法helpermethods。例如,MapControl有AddShapeFile方法。4、事件<Events>5、BuddyControlsToolbarControl和TOCControl分

10、别与其它的"buddycontrol"协同工作。典型的"buddycontrol"有MapControl,PageLayoutControl,ReaderControl,SceneControl,orGlobeControl。设置"buddycontrol"可以在设计期设置如果控件属性页或在运行期用SetBuddyControl方法。6、控件命令CONTROLCOMMANDSArcGISEngine提供了一系列的命令、工具和菜单与ArcGIS控件一起使用。例如,有一套地图漫游、要素选取和图形化命令与MapControl和PageLay

11、outControl协同工作。类似的还有一套SceneControl,GlobeControl和ReaderControl命令。由于应用程序使用一个单独的控件,这些命令通过用运行时创建一个新的命令实例并将控件传递给命令的OnCreate事件可以直接与控件工作。当应用程序使用ToolbarControl与一个"buddycontrol"一起工作时,既可以在设计期通过属性页,也可以在运行期通过语句或终端用户自定义方式将这些命令加入到ToolbarControl中。开发人员在使用ArcGIS控件时也可以通过创建自己的命令、工具和菜单来扩展ArcGISEngine提供的命令。其中的

12、HookHelper,GlobeHookHelper和SceneHookHelper对象可以简化此过程。欲知如何使用HookHelper对象来创建自定义的命令,请参考第六章"DeveloperScenarios"的”创建应用程序”一节。7、MapAuthoring卜表总结了各个ArcGIS控件可以装载的文档类型MapDocument<*.mxd,*.mxt>LayerFiles<*.lyr>SceneDocument<*.scd,*.sxt>GlobeDocument<*.3dd,*.sdt>PublishedMapNoper

13、missiontoloadinacustomizedapplication<ArcReaderapplicationonly>Files<*.PermissiontoloadincustomizedapplicatioMapControlYesYesNoNoNoNoPageLayoutYes*YesNoNoNoNoControlSceneControlNo*YesYesNoNoNoGlobeControlNo*YesNoYesNoNoReaderControlNoNoNoNoNoYes*ArcReaderControlNoNoNoNoNoYes*ArcReaderContro

14、l只在ArcGISPublisher扩展模块中才有,然而,这里列出来是因为它和ReaderControl类似*这些ArcGIS控件没有属性来直接装载图层文件*.lyr,但是可以通过MapDocument对象直接装载第二节MapControl和PageLayeroutControlMapControl和PageLayeroutControl对应于ArcMap桌面应用程序中的"数据DATA"和"布局LAYOUT”视图。它们分别封装了Map对象和PageLayout对象。可以在设计期通过属性页为MapControl和PageLayeroutControl指定地图文档,控

15、件可以link或包含contain地图文档。当linking时,无论何时只要在容器上创建控件,他将重新读取地图文档,并且总是显示最新的地图文档。当"包含containing"时,控件将拷贝地图文档到控件中,但不会显示从那以后对文档所作的任何更新。另外一种方法就是通过LoadMXFile方法装载文档到控件中。MapControl和PageLayeroutControl不仅可以读取地图文档,还可以写入地图文档*.mxd。他们都实现了ImxdContents接口使得MapDocument对象可以将控件的容写入到一个新的地图文档中。MapControl中的TrackRectangl

16、e,TrackPolygon,TrackLine和TrackCircle等Helper方法可用来跟踪显示屏幕中的形状。用VisibleRegion属性可以改变MapControl的显示区域。PageLayoutControl中的FindElementByName和LocateFrontElement等Helper方法帮助开发人员管理要素,同时有Printer、PrinterPageCount属性和PrintPageLayout方法协助打印工作。GlobeControl图,它们分别封装了入到GlobeControlGlobeControl义命令就可以漫游第三节GlobeControl和Scene

17、Control和SceneControl对应于ArcGlobe和ArcScene桌面应用程序中的3D视GlobeViewer对象和SceneViewer对象。Globe和Scene文档可分别载和SceneControl中来保存开发人员组成的地图。和SceneControl都有建的地图导航功能,用户不需使用控件命令或自定设置其Navigate属性。用户可以使用鼠标左键前后左右翻转显示3D视图,可视化3D数据。要使用其建的导航功能,必须通过属性页或程序,右键放大缩小显示。第四节ReaderControlReaderControl对应于ArcReader桌面程序的"数据data”和”布局l

18、ayout”视图以与它们构成的"容表TableofContents"。ReaderControl还包含ArcReader使用的部窗口和工具,比如:”查找Find”窗口和”查询Identify”工具。可以载入ArcMap或ArcGISPublisher扩展模块生成的发行地图文件PublishedMapFiles<*.PMF>。ReaderControl中有一个简单的对象模型图,展示了ArcReader的所有功能,而不需访问ArcObjects。因此,用ReaderControl开发应用程序时,不需具有ArcObjects开发经验。然而,如果一个发行地图文件对其容的

19、访问没有限制的话,那开发人员可以访问底层的ArcObjects,并可以像开发MapControl和PageLayoutControl一样来开发ReaderControl。虽然ArcGISEngine中不包含ArcReaderControl,这里提起是因为它和ReaderControl类似。ArcReaderControl和ReaderControl一样具有一个简单的对象模型图。然而,ArcReaderControl不能当作一个"buddycontrol"来与TOOControl或ToolbarControl来协调工作,开发人员也不能访问任何底层的ArcObjects。用Ar

20、cReaderControl开发应用程序需要ArcGISPublisher扩展模块,并且开发的程序可以发布到任何装有免费的ArcReader的机器上。第五节TOCControl和ToolbarControl1、TOCControlTOCControl和一个"buddycontrol"协调工作。"buddycontrol"可以是MapControl、PageLayoutControl、ReaderControl、SceneControl或GlobeControl。"buddycontrol"可以在设计期通过TOCControl属性页开发

21、环境中支持属性页功能或运行期TOCControl的父类容器显示时使用SetBuddyControl方法来设置。每个TOCControl的"buddycontrol"实现了ITOCBuddy接口。TOCControl使用"buddycontrol"来显示地图、层、符号容的一个交互式树状视图,并保持其容与"buddycontrol"一致。例如,如果TOCControl将一个MapControl作为"buddy",当从MapControl的地图上移除一个层时,TOCControl上也会移除相应的层;同样,当用户与TOCC

22、ontrol交互隐藏一个图层时,MapControl上相应的层就不再显示。2、ToolbarControlToolbarControll和一个"buddycontrol"协调工作。"buddycontrol"可以是MapControl>PageLayoutControl、ReaderControl、SceneControl或GlobeControl。"buddycontrol"可以在设计期通过ToolbarControl属性页开发环境中支持属性页功能或运行期ToolbarControl的父类容器显示时使用SetBuddyCont

23、rol方法来设置。ToolbarControl拥有一个包含命令、工具、工具控件和菜单的面板,控制"buddycontrol"的显示。每个ToolbarControl的"buddycontrol"实现了ItoolbarBuddy接口。这个接口用来设置"buddycontrol"的CurrentTool属性。例如,试想一个ToolbarControl拥有一个"PageZoomIn"工具并将"PageLayoutControl"作为"buddy",当用户点击ToolbarContr

24、ol上的"PageZoomIn"时,它就成为PageLayoutControl的CurrentTool。"PageZoomIn"工具的实现需要询问ToolbarControl来访问其"buddycontrol"即PageLayoutControl,并获得PageLayout,然后它将实现用户拖拉矩形框的动作并改变PageLayout的围。第六节使用ToolbarControl开发程序ToolbarControl不仅提供部分用户界面,还提供部分程序框架。ArcGIS应用程序,如:ArcMap、ArcGlobe和ArcScene都具有强大

25、而灵活的框架,他们包含了用户界面组件,像:工具条toolbars、命令commands、菜单menus、坞泊窗口dockablewindows和状态栏statusbars。框架使得用户通过移位、添加、移除这些用户界面组件就可以定制程序。许多开发环境都提供一些简易对话框、窗体、多窗体等形式的框架,也提供普通的用户界面组件,像按钮、状态栏和列表框等。然而,想要让工具条和菜单拥有可执行命令仍需要填充大量的实质性代码,特别是当用户可以自定义时。Toolbarcontrol和其库文件中的对象提供了类似ArcGIS程序中框架。开发人员使用Toolbarcontrol开发程序时可以使用所有的这些框架。1、命

26、令CommandsArcGIS提供了许多与ArcGIS控件协同工作以执行特殊动作的控件命令包。开发人员可以通过创建执行特殊工作的自定义命令来扩展这些命令包,所有这些命令对象都必须实现IComman裁口,因为ToolbarControl使用这个接口来调用方法并在适当的时候访问属性。当Command寸象寄宿在ToolbarControl上时,会立即调用ICommand:OnCreate方法,该方法传递一个句柄或"勾子hook"给程序。命令的实现只是进行正常测试,看是否支持这个"勾子hook"对象也就是说,这个命令测试是否可以和这个"勾子”正常工作。

27、如果不支持这个"勾子”,则命令使其无效;如果支持,则命令保存"勾子”备用。例如,如果"OpenMapDocument"命令和"MapControl"或"PageLayoutControl"一起工作,他们作为"勾子”被传递到OnCreate方法,这个命令将存储"勾子"备用。如果ToolbarControl作为"勾子”被传递到OnCreate方法,这个命令将使用Buddy属性正常检查和ToolbarControl协调工作的"buddycontrol"的类型。例

28、如,如果一个命令寄宿到ToolbarControl上只能与ReaderControl一起工作,但ToolbarControl的"buddy"却是MapControl,那么命令将使其无效。存在HookHelper、GlobeHookHelper和SceneHookHelper对象可以帮助开发人员创建与ArcGIS控件和程序一起工作的自定义命令。HookHelper用来创建与MapControl>PageLayoutControl、ToolbarControl和ArcMap工作的命令。SceneHookHelper用来创建与SceneControl、ToolbarCont

29、rol和ArcScene工作的自定义命令。GlobeHookHelper用来创建与GlobeControl、ToolbarControl和ArcGlobe工作的自定义命令。Helper对象可以处理命令的OnCreate方法,而不用程序员自己添加代码来判断传递给命令的"勾子"。Helper对象用来处理传递的"勾子"并返回ActiveView、PageLayout、Map、Globe和Scene对象取决于helper对象的类型,而不管"勾子"的类型。欲知如何使用与MapControl>PageLayoutControl和Toolba

30、rControl一起工作的HookHelper对象来创建自定义命令,请参考第六章"DeveloperScenarios"中的"BuildingApplication"一节。当用户点击ToolbarControl上的一个命令项时会调用ICommand:OnClick方法。根据命令类型的不同,命令将使用"勾子”从"buddycontrol"中访问需要的对象。有三种命令类型:1、单击命令实现ICommand接口的单击响应。单击的结果就是调用ICommand:OnClick方法,并执行一些动作。通过改变ICommand:Checke

31、d的值,简单的命令项可以像开关按钮一样。只有单击命这种类型令可以寄宿在菜单上。2、命令项或工具同时实现了ICommand和Itool接口,需要用户与"buddycontrol"显示交互。ToolbarControl维护一个CurrentTool,当用户单击ToolbarControl上的工具时,该工具就成为CurrentTool,前一个工具将处于无效状态。ToolbarControl将设置"buddycontrol"的CurrentTool,当CurrentTool成为当前工具,它将从"buddycontrol"接受鼠标和击键事件。3

32、、命令项或工具控件同时实现了ICommand和ItoolControl接口。这是一个普通的用户接口组件,像ToolbarControl上的Listbox或ComboBoxToolbarTool上有一个来自IToolControl:hWnd属性的窗口句柄提供的一个小窗口。只有一个工具控件的单独实例可以加入至UToolbarControl中。将命令加入到ToolbarControl中有两种方法:1、指定一个UID对象来唯一标识一个命令使用GUID;2、为AddItem方法传递一个存在的Command寸象实例。如果有可能还是指定一个UID。如果指定了一个UID,ToolbarControl就可以标识

33、这个命令是否在以前加入过,并且这样可以重用先前的命令实例。当传递一个存在的命令实例时,由于无法标识命令的唯一性,因此在ToolbarControl中可能存在多个命令实例。2、工具条按钮ToolbarItem工具条按钮是寄宿在ToolbarControl或ToolbarMenu上的一个单独的命令或菜单。ItoolbarItem接口的一个属性决定了用户界面中按钮的显示形式。例如,按钮左边是否有垂直线说明了是否开始一个新的组Group,按钮的Style决定了是否显示图标、字或两者都显示。CommandMenu属性将返回ToolbarItem所代表的真实命令或菜单。3、更新命令UpdatingComm

34、ands为确保寄宿在ToolbarControl上的每个ToolbarItem与其底层的Enabled、Bitmap和Caption属性同步,默认情况下ToolbarControl每半秒自动更新一次。改变其UpdateInternal属性可以改变更新的频率。如果UpdateInternal值为0,那么ToolbarControl将不会自动更新,程序员必须在过程中调用Update方法来更新每个ToolbarItem的状态。在第一次调用Update方法时,ToolbarControl将检查每个ToolbarItem的底层命令的ICommand:OnCreate方法是否被调用过,如果没有,程序将自动

35、传递ToolbarControl勾子给ICommand:OnCreate方法。4、工具条菜单"ToolbarMenu"ToolbarControl可以拥有下拉菜单项。ToolbarMenu是单击命令形式的垂直下拉列表,用户必须选择其中的一项,或者单击ToolbarMenu以外的地方使其消失。ToolbarMenu只能拥有命令项不能是工具,也不能是工具控件。ToolbarMenu本身既可以寄宿在ToolbarControl上,或作为一个子菜单submenu寄宿在另一个ToolbarMenu上,也可以作为弹出菜单popupmenu。参考第六章"DeveloperSce

36、narios"的"BuildingApplications"节,查看如何创建拥有与PageLayoutControl工作的控件命令的弹出菜单。5、命令池CommandPool每个ToolbarControl和ToolbarMenu都有一个CommandPoo采管理正在使用的Command对象集合。通常,不管一个命令是通过属性页加入到ToolbarControl中,还是通过程序自动加入到CommandPool中,程序员都不用接触CommandPooJCommand寸象将作为一个唯一标识命令用GUIE3的UID对象或已存在的一个Command寸象实例加入到Comman

37、dPool如果加入一个Command寸象实例,那么在CommandPool中将可能存在多个相同的命令实例,而无法唯一标识。如果加入的是一个UID对象,CommandPool就能标识是否存在这个命令,如果存在,那么就可以重用。CommandPool通过记录是否调用过一个命令的OnCreate方法来进行管理,如果调用过,就重用这个命令,并将UsageCount加1。例如,如果当一个"ZoomIn”工具以UID形式加入到ToolbarControl两次,当其中的一个"ZoomIn"被选中并处于按下状态时,另外一个"ZoomIn"也会处于按下状态,因为

38、他们使用的是同一个Command寸象。当程序包含多个ToolbarControls或ToolbarMenus时,程序员应该保证每个ToolbarControls和ToolbarMenus都使用同一个CommandPool,以确保程序中创建了一个命令实例。6、自定义Customization设置ToolbarControl的Customize属性可以使其处于自定义模式,这样改变了ToolbarControl的行为,并允许用户重设、移除、添加和改变工具的外表。1、用左键选择ToolbarControl上的一项,然后拖动该项到新的位置,或放下以将菜移除。2、用右键选择一项并显示一个自定义菜单。自定义

39、菜单可以移除该项,或改变其样式Style图标、字或图标和字bitmap,captionorboth并对Toolbaritem分组。当ToolbarControl处于自定义模式时,程序员可以用程序启动无模式自定义对话框modelessCustomizeDialog。自定义对话框通过读取"ESRIControlsCommands""ESRIControlsToolbars"和"ESRIControlsMenus'组件目录中的项,列出所有的控件命令和自定义命令、工具与菜单。如果有必要程序员可以改变自定义对话框,使用可变的组件目录。用户可以通过

40、拖动并放下或双击ToolbarControl来将这些命令、工具和菜单加入到ToolbarControl中。自定义对话框是无模式的,这样用户就可以与ToolbarControl进行交互。StartDialog方法启动自定义对话框后会立即返回,而对话框仍显示在屏幕上。为了在自定义对话框打开时保持对它的引用,必须养成这样的好习惯,保存自定义对话框的一个类级别变量并监听它的ICustomizeDialogEvents。参考第六章"DeveloperScenarios"的"BuildingApplications"节,查看当ToolbarControl处于自定义模

41、式时如何显示自定义对话框。7、操作栈OperationStackToolbarControl用一个OperationStack来来管理撤消和重复功能。用户操作被每个ToolbarItem的底层命令加入到操作栈,这样用户可以任意地对操作进行撤消和重复。例如,当一个图形要素被移动之后,可以通过将图形移动到原始位置以撤消这个操作。命令是否使用OperationStack取决于其实现。通常,程序员为程序创建一个单独的ControlsOperationStack默认情况下OperationStack属性是空值Nothing并将其设置为每个ToolbarControl的属性。取消和重复命令可以通过Oper

42、ationStack加入到ToolbarControl中。第七节不用ToolbarControl来创建程序虽然用ToolbarControl可以迅速创建类似ArcGISDesktop的部分程序框架,但有时程序也不需要ToolbarControl。1、ToolbarControl的可视化界面可能与程序不匹配;2、不需要ToolbarControl的命令对象的实现;3、当前程序中存在一个应用程序框架;4、ToolbarControl和它拥有的命令通过多个"buddycontrols"工作时很困难;当上述情况中,程序员必须直接使用MapControl、PageLayoutCont

43、rol、SceneControl、GlobeControl或ReaderControl。其他任何需要的用户界面组件由开发环境提供,如命令按钮、状态栏和列表框等。例如,在一个MapControl程序中加入地图导航功能,可以按以下步骤来完成:1、设置MapControl的OnMouseDown件中的IMapControl2:Extent属性为IMapControl2:TrackRectangle方法的返回值Envelope来创建"ZoomIn"功能;2、设置IMapControl2:Extent属性为IMapControl2:FullExtnent属性的Envelope,来创建

44、"FullExtent"功能。这些代码可以加入到开发环境提供的命令按钮的Click事件。再者,ArcGISEngine提供的控件命令,或用HookHelper、SceneHookHelper或GlobeHookHelper对象创建的自定义命令,都可以与单独的ArcGIS控件直接工作。然而,这样程序员就必须负责在适当的时候调用ICommand:OnCreate和ICommand:OnClick方法,并按如下步骤读取IComman裁口的属性来建立用户界面:1、用程序创建一个新的命令实例,并将这个单独的ArcGIS控件传递给OnCreate事件。例如,3D的"ZoomF

45、uulExtent"命令要和GlobeControl一起工作的话,就心谤腹非将GlobeControl作为勾子传递给OnCreate方法;2、程序员可以不用ToolbarControl,而用CommandPo。附'象来管理程序使用的命令。CommandPoo将为调用每个基于本身的Hook属性的命令提供支持;3、如果命令只实现了ICommand接口,程序可以在适当的时候调用OnClick方法来执行特殊的动作。如果命令是一个同时实现了ICommand和ITool接口的工具,那么程序员就必须在ArcGIS控件中将其设置为CurrentTool。ArcGIS控件将发送键盘和鼠标事件到

46、该工具。4、命令的Enabled、Caption和Bitmap属性是可读写的,通过将其设置为开发环境提供的命令按钮的属性,可以建立用程序的户界面。虽然用这种方法来建立程序需要程序员写更多的代码,但这可以换取更多的灵活性。第四章开发者环境ArcObjects是基亍:微软的组件对象模型COM的,ArcGIS用户不必理解COM但如果你是一个开发人员,想用ArcObjects开发应用程序或扩展ArcGIS程序,那你必须理解COM即使你打算用C+、Java或.NETAPIs而不用COM对理解的水平的需求取决于你想定制或开发的深度。至少,要先复习一下微软组件对象模型和用ArcObjects开发部分,然后再

47、根据情况选择后面的API-specific章节。每节API-specific都将向你介绍所支持语言的开发技巧和用ArcObjects深入开发详细特点。本章所涉与的主题包括:1、微软组件对象模型COIM2、用ArcObjects开发3、开发平台和环境VisualBasic4、VisualC+5、.NETAPI6、JavaAPI7、C+API第一节微软组件对象模型COM1、CO"是一种面向对象语言,而是一种协议或标准。它不仅仅是一种技术,还是一种软件开发的方法论。CO阮义组件或模块之间的一种通信协议,还定义了一种程序模型,即基于接口的程序。2、COM允许对象二进制级别的重用,这意味着第三

48、方开发都不需要访问源代码、头文件或对象库就可以扩展系统,甚至在最底层。一、组件Components>对象Objects、客户端Clients和服务端ServersCO曜C/S结构,服务端或对象提供一些功能,客户端则使用这些功能。COMH化了客户和对象的通信。一个对象可以同时是服务端和客户端。客户端和服务端可以在同一进程空间,也可以在不同的进程空间。在同一进程空间In-process时,服务端以动态库DLL形式封装,当客户端第一次访问服务时,这些动态库被载入客户端地址空间。在不同进程空间Out-of-process时,服务端以可执行文件EXE形式封装,并在自己的地址空间运行。COM寸客户端

49、存在不同的透明度。两种方法各有好处。动态库调入存比较快,调用其函数也非常快。可执行文件则提供更好的解决方案当服务失败时,客户不会崩溃,并且安全性能好,因为服务拥有自己的安全措施。在分布式系统中,可执行文件更灵活,即使服务对客户有不同的字节要求也没关系。大部分的AO服务是以动态库形式封装的,后面将显示其好处。在ArcGIS程序中,有许多对象通过接口提供许多属性和方法。当你使用ESRI对象库时,可以认为所有这些属性和接口都已完全实现,只要他们在对象图objectdiagram上出现就只可以使用。ClientandserverQbj仓citsinsideanin-processserverareac

50、cesseddrectlybytheirclients.Objectsinsideanaut-of-processserverareaccessedbyCOM-suppliedproxyobjects-.rhichmakeaccesstransparenltotheclient._.Objectsinsideanout-of-processserverareaccessedbyCOM-sunpliedproxyobjectsmakeaccesstransparervttotheclientThirun-timehandlestheremolinglaye、类工厂Classfactory在每个服

51、务端中都有一上对象一一类工厂,COM运行时与其交互来实例化一个特殊的类。都对应一个类工厂。通常服务端请求一个对象时厂会创建一个新的对象给客户。三、单一对象SingletonObjects尽管这是通过的实现方式,但不是唯一的。类工厂也只可以只在第一次创建一个对象实例,在以后调用时,传递相同的对象给客户。因为在整个过程中只有一个对象实例,所以这种实现方式叫单一对象。四、全局唯一标识GloballyUniqueidentifiers在一个分布式系统中,通常会有成千上万个接口、类和服务,在运行时期当定位和绑定客户与对象时必须引用它们。很明显,使用人名这种方式会造成潜在的冲突,所以COM#用全局唯一标识

52、GUID可,它是一个128位的数字,并且在全世界能保证其唯一性。到公元5770年,每秒可以生成1千万个GUIDs,而且每个都唯每个COM!,当客户从,相应的类工,并将其传递COMAPI定义了一个函数可以生成GUIDs,另外,所有支持COM勺开发工具都会自动赋GUIDs值。GUIDs和开放组织的分布式计算环境定义的普通唯一标识UUIDs一样。下面是注册形式的一个GUIDs例子:CIUnknowninlerfateBOCOMobjectB丫IUnknownICIassFacloryaClassfactoryB、。IUnknownCIUnknownCOM(E6BDAA76-4D35-11D0-98B

53、E-00805F7CED21)o:Microsoft'sVisualStudio提供有一个图形化工具GUIDGENEXE用来生成GUID,五、CO峻和接口COMClassandInterfacesCOM口都是抽象的,即接口没有实现,其实现来自类的实现。接口只是述了对象可以接受哪些请求。不同对象的接口实现不同。因此,对象继承接口类型,而不是其实现,这中心任务类型继承。功能被接口抽象模块化了,实现则在类实现中完成。通常类和接口分别表示COM的什么和如何,接口定义了一个对象能做什么,类定义了如何去做。COM类提供了一个或多个接口的代码,进而封装了类的整个功能。两个类可以有同样的接口,但其实现

54、可能不同。通过这种方式实现接口,COM显示了经典的面向对象的多态机制。CO林支持多实例的概念,然而这并不是意味着是一个缺陷,因为单一类可以实现多个接口。请看如图多态机制:图:这是Geodatabase对象模型的简单一个部分,显示了抽象类、可实例化类colcass和类实例之间的类型继承。类对象反过来实现几何基类中定义的接口实例化类来访问。可实例化类coclass是一个可以公开创建的类在AO中有三种类类型必须注意:才由象类abstractclass、可实例化类coclass和类class。抽象类不能创建,它是对子类实例的一个单独说明通过类型继承。AO中数据集Datset或几何类Geometry就是

55、抽象类,几何类对象不能创建,单折线类Polyline对象可能创建。折线,因此基类对象类中定义的任何接口都可以通过可类的实例并将结果对象传递给客户让其使用类中定义的接口提供的服务。建,但其对象可以被AO中的对象创建,并传递给客户使用。,换句话说,他使得COMT以创建这个一个类不能公开创下图显示了CO啖中实现接口时的多态行为。注意Human和Parrot类都实现了ITalk接口,Italk接口定义了方法和属性,如:StartTalking、StopTalking或Language,但很明显两个类对此接口的实现不同。该图显示了如何在多个对象之间共享以接口形式表达的普通行为来支持多态,这里以人和动物为

56、例六、部接口InsideInterfacesCO戚口就是COM寸象之间如何通信。当使用COM寸象时,程序员并不直接操纵COM时象,而是通过其接口获得访问权限。CO戚口被设计成一组逻辑上相关的函数,客户调用虚函数,服务端来实现,通过这种方法,对象的接口就成为客户和对象的联络员。一个对象的客户拥有指向这个对象的接口指针,对这个接口指针的引用是透明的,因为客户客户不能获得任何对象部实现的消息,也不能直接访问对象的状态数据statedata。客户必须能过接口的成员函数来通信。这样就允许CO傩供一个二进制标准,对象可以通过这个标准来进行有效通信。接口允许程序员抽象地模块化功能。VisualC+璀序员将接

57、口看作一个纯虚函数的集合,而VisualBasic程序员则将其看作一个属性、函数和子程序的集合。在COM接口的基础概念,COM说明Microsoft,1995强调了在讨论COM®口时必须注意以下4点:1、接口不是类,一个接口不能被自身实例化,因为它没有实现;2、接口不是对象,一个接口是一组函数的集合,并且符合二进制标准,客户和对象以此通信;3、接口是强制类型的stronglytyped,每个接口,都有自己的接口标识,从而减少了接口之间类似人名的冲突的可能性;4、接口是不变的,接口一旦被定义和发布,就不能再更改。接口一旦公布,就不能再改变其外部签名。但可以在任何时候修改对象提供接口的实

58、现细节,修改可以是对错误小的修正,也可以是部算法的重改,不管怎样,使用接口的客户不受影响,因为接口修改前后对他们来说是一样。这意味着对以新的DLL或EXE形式发布的服务端进行升级时,客户端不需重新编译就可以使用新的功能。如果接口外部签名无效了,那会产生新的接口提供新的服务。旧的或已放弃的接口并不从类中移除,以确保旧客户程序都可以继续享用新的服务,新客户则可以在新旧接口之间进行选择。七、未知接口TheIUnknownInterface所有的COM接口都继承自lUnknows接口,所有的COM对象都必须实现这个接口。lunknows接口有两个任务:控制对象的生命同期并提供运行时类型支持。客户通过l

59、unknows接口来保持对一个使用中的对象的引用,而把生命周期则交给对象自己管理。对象生命周期使用AddRef、Release方法和一个引用计数器来控制。每个对象都必须实现lunknows接口才能控制自己的生命周期。在任何时候创建或复制对象指针都会调用AddRef方法,此时计数器加1,当客户不再需要这个指针时,就会调用相应的Release方法,计数器减1,当引用数减到0时,对象就自动销毁。八、接口定义语言InterfaceDefinitionLanguage微软接口定义语言MicrosoftInterfaceDefinitionLanguage用来描述COM寸象与其接口,它是对分布式计算环境组织DistributedComputingEnvironment定义的接口定义语言InterfaceDefinitionLanguage用来描述客户的服务端之间的远程调用的扩展。九、类型库类型库是一个IDL文件的二进制版本,包含了服务端中所有可实例化类、接口、方法和类型的二进制描述。十、入接口和界外接口Inbo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论