关于初始化Engine许可的,其实原理都很简单,大家一般都没有问题,但又往往会因为不够细心加上Engine的“小脾气”,让不少程序员都要在这里犯错。

以Engine9.2为例,应用程序是强制初始化许可,也就是说必须使用LicenseControl或AO接口初始化许可,否则应用程序无法启动。Engine9.1未采取强制初始化许可策略,而是应用程序创建时就初始化标准Engine许可。在一般情况下,我们会用将LicenseControl拖放到主窗体上完成初始化。但当Engine程序需要使用ArcGIS Engine Enterprise Geodatabase(以下简称GDB Update)许可的时候,我们就往往会由于意识不到应该使用该许可,以及无法正确的初始化该许可而陷入麻烦。

注意:以下所探讨的所有“许可”并不包括扩展模块许可,如三维分析、空间分析和网络分析;而只是包括Engine可使用的Engine标准许可、Engine GDB Update许可、ArcView许可、ArcEditor许可和ArcInfo许可五种。

问题分为三方面:

1.  什么情况下需要GDB Update许可

当需要对SDE里数据进行编辑时,以及需要在SDE和Personal Geodatabase中创建复杂ArcGIS对象时,我们需要使用GDB Update许可。

对SDE里的数据编辑,很好理解,大致就是进行数据插入,删除,更新;对表添加、删除和修改,表结构的变化(添加、删除列)等,因为这些动作都会造成后台数据库的写操作。

对于Personal Geodatabase,进行简单数据对象和编辑,包括创建、删除和修改普通表都是不需要GDB Update许可的,但对于复杂的Geodatabse对象的创建、删除和修改,则需要GDB Update许可,其中复杂的Geodatabse对象包括几何网络,网络分析模型,拓扑,关系类。这也是为什么往往有些经验的程序员写好了一个创建几何网络或拓扑的程序后,执行起来会被报“需要Geodatabase Update许可”的错。

2.  怎样初始化GDB Update许可

当我们意识到需要使用Engine的GDB Update许可时,怎样才能将它正确的初始化呢?Engine给我们提供了两种初始化许可的方法:

1)  使用LicenseControl控件。将该控件拖放到主窗体之上,勾选适当的许可,并确保程序启动该窗体可加载,就可以完成许可初始化。

2) 使用IAoInitialize.Initialize方法加入适当的参数进行初始化。VB6的例子代码如下:

Option Explicit

Dim m_pAoInitialize As IAoInitialize

Private Sub Form_Load()

'实例化

Set m_pAoInitialize = New AoInitialize

'初始化 EngineGeoDB 许可

Call m_pAoInitialize.Initialize(esriLicenseProductCodeEngineGeoDB)

End Sub

当然,对于一个健壮的程序而言,我们还需要在初始化之前先判断将被初始化的许可是否可用,应先使用IsProductCodeAvailable方法进行判断,需要初始化扩展模块的许可,可使用CheckOutExtension方法。

3.  初始化过程中容易犯的错误

我们应该注意到,Engine是有些“小脾气”的。如果没有按照它的“习惯”,它是不会为我们乖乖工作的。其中有个很重要的原则(以下简称“重要原则”)就是一个程序只能初始化许可一次,已经初始化许可的程序一旦运行就无法再修改其初始化的许可,即程序运行期间无法修改其使用的许可。

1)LicenseControl和IAoInitialize接口两种初始化方法,一个应用程序中只能使用一种方法,如果两种一起使用,哪一个“说得算”就不一定了。如果这两种方式同时使用,且两种初始化的许可级别一样时,也许我们感觉不到什么不对,但当我们需要修改初始化许可级别,而又只改了一种初始化方法却忘记了另一种,根据“重要原则”可知,这次修改初始化很可能无法生效。

2) 使用LicenseControl初始化时,当我们将其拖放到窗体上时,它往往会自动勾选“ArcGIS Engine”许可,也就是自动初始化标准Engine许可。但当我们需要通过它更改许可级别时,Engine9.2会提示如下信息:

该信息的含义是警告我们该程序已经初始化了Engine标准许可,若要初始化其他许可,重启开发环境后才会生效。对这句话的解释是,如果我们想通过LicenseControl初始化其他级别的Engine许可,需要在勾选其他许可之后关闭开发环境(如图为VB6)再打开才生效,否则还是原来的许可。另外,对于Engine9.1,此种情况下没有该警告,问题会更隐蔽(无语吧 -_-!)。

3)LicenseControl中多选许可是没有意义的,第一个被勾选的许可生效。

这种情况下,实际上该应用程序初始化的是Engine标准许可,而不是其他。虽然LicneseControl从操作上可以让用户多选许可,但并不代表它会将您勾选的许可全部签出。另外,这些许可都是有对应和包含关系的。其中ArcGIS Engine与ArcView是对应的,ArcGIS Engine Enterprise Geodatabase与ArcEditor是对应的;ArcGIS Engine Enterprise Geodatabase是包含ArcGIS Engine许可的。当我们需要GDB Update许可的时候,仅仅需要勾选ArcGIS Engine Enterprise Geodatabase即可,为了“保险起见”勾选上其他许可反而会弄巧成拙。

使用IAoInitialize接口进行初始化,Initialize方法只能调用一次,多余的调用是不会生效的,道理就像上面LicenseControl勾选了多个许可一样。

ESRI CHINA

白旭阳

http://www.cnblogs.com/feilong3540717/archive/2011/04/06/2006605.html

转-ArcGIS Engine许可初始化的更多相关文章

  1. Engine许可初始化 - gis开发初步

    当需要对SDE中的要素类和要素数据集(矢量和栅格)进行编辑时,例如在调用IFeatureDataset的CreateFeatureClass方法时,报错提示: The application is n ...

  2. 转-ArcGIS Engine中的License设置

    AE开发中的License有两种方法进行设置,一种是通过LicenseControl控件,另一种是通过IAoInitialize接口设置.整个应用程序中只能有一种方式存在,如果进行了两种License ...

  3. ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

    原文:ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...

  4. ArcGIS Engine中的重点类库介绍

    转自原文ArcGIS Engine中的重点类库介绍 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System ...

  5. 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发

    原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...

  6. ArcGIS Engine控件运行许可(转)

    ArcGIS Engine控件运行许可   Runtime绑定: 在ArcGIS Engine10.0中,许可方式发生了一定的变化,ArcGis10有一个新的要求---runtime绑定.就是在任何A ...

  7. ArcGIS Engine开发前基础知识(1)

    ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现 ...

  8. 【转载】Python与ArcGIS Engine的集成

    本文转载自Fransico<Python与ArcGIS Engine的集成>   1 在Python中调用AO类库 1.1  准备工作 本文所使用环境:ArcGIS 10.0.Python ...

  9. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

随机推荐

  1. .NET应用架构设计—工作单元模式(摆脱过程式代码的重要思想,代替DDD实现轻量级业务)

    阅读目录: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单示例 4.总结 1.背景介绍 一直都在谈论面向对象开发,但是开发企业应用系统时,使用面向对象开发最大的问题就是在于,多个对象之 ...

  2. .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)

    阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...

  3. SQLServer 日期函数大全

    一.统计语句 1.--统计当前[>当天00点以后的数据] ) ) ORDER BY dateandtime DESC 2.--统计本周 3.--统计本月 4.统计当前 SELECT * FROM ...

  4. 问题解决——CVSListBox的使用

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  5. Elasticsearch配置文件说明

    一.Cluster  setting Cluster indices.ttl.interval  允许设置多久过期的文件会被自动删除.默认值是60秒. indices.cache.filter.siz ...

  6. Serial Port Programming using Win32 API(转载)

    In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...

  7. load和get的延迟加载

    load和get方法的区别: Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象. 区别在于: 如果未能发现符合条件的记录,get方法返回nul ...

  8. 为普通Object添加类似AttachedProperty的属性

    为普通Object添加类似AttachedProperty的属性   周银辉 我们知道,在WPF中对应一个DependencyObject,我们很容易通过AttachedProperty来为类型附加一 ...

  9. PhpStorm XDebug 远程调试

    现在我们自己公司的各种开发和测试服务器,都是使用阿里云的服务器.一些PHP的项目,无法在本地搭建完整的环境,在外网服务器上调试更方便定位问题.发现网上没有完整的关于如何配置PHPStorm和XDebu ...

  10. HTML5的postMessage使用记要

    HTML5提出了一个新的用来跨域传值的方法,即postMessage(这个名字太通俗了所以你最好看看是不是自己写过一个同名的把它覆盖了).幸运的是IE8就开始支持了. 我们假设有两个网站,1.com与 ...