關於初始化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勾選了多個許可一樣。
一個 初始化許可的例子,這里初始化了編輯和網絡分析許可