使用动态链接库组件进行ArcGIS开发

      动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL不是可执行文件,DLL 是一个包含可由多个程序同时使用的代码和数据的库。

      通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您具有一个建筑工程造价计算程序,而不同区域的建筑材料其价格不尽相同,而且随着时间的变化,建筑材料的价格也随着经济的发展而发生着变化,当这些变化被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。

      DLL的优点:

  1. 扩展了应用程序的特性;
  2. 可以用许多种编程语言来编写;
  3. 简化了软件项目的管理;
  4. 有助于节省内存;
  5. 有助于资源共享;
  6. 有助于应用程序的本地化;
  7. 有助于解决平台差异;
  8. 可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。

      DLL其实就是Windows平台下的一种类的文件编译格式,该格式的文件可以被任何支持COM规则的语言所支持和引用。ArcGIS Object组件本身的物理文件就是DLL文件,开发人员也可以编写自己的DLL组件进行二次开发。

      下面以一个实例来演示如何在Visual Basic环境下创建DLL组件。

      启动Visual Basic,建立一个ActiveX dll工程。如下图所示:

  

      为工程添加引用,Projects>References打开References对话框,在对话框中选择ESRI System Object Library、ESRI SystemUI Object Library、ESRI Framework Object Library和ESRI ArcMapUI Object Library四个对象库。如下图所示:

    

      添加名为Form的窗体,向窗体中添加名为Picture1的图片框,设置Picture1的Picture属性,为其指定一个bmp格式的图标。

      下面可以开始编码了。打开Class1类模块文件,在开头加入如下代码:

      Option Explicit

      Implements ICommand
      Dim pApp As IApplication

      在General下拉框中选择ICommand接口,在Declarations下拉框中选择Bitmap,带自动出现的代码段中添加ICommand_Bitmap = Form1.Picture1.Picture.Handle来实现实现ICommand接口的BitMap属性。使用同样的步骤实现IComand接口的Caption、Category、Checked、Enabled、HelpContextID、HelpFile、Message、Name、ToolTip属性和OnClick与OnCreat方法。完整代码如下:

代码
Option Explicit
Implements ICommand
Dim pApp As IApplication

Private Property Get ICommand_Bitmap() As esriSystem.OLE_HANDLE
ICommand_Bitmap
= Form1.Picture1.Picture.Handle
End Property

Private Property Get ICommand_Caption() As String
ICommand_Caption
= "HSCommand"
End Property

Private Property Get ICommand_Category() As String
ICommand_Category
= "HSCustomTools"
End Property

Private Property Get ICommand_Checked() As Boolean

End Property

Private Property Get ICommand_Enabled() As Boolean
Dim pMxDoc As IMxDocument
Dim pLayerCount As Integer
Set pMxDoc
= pApp.Document
pLayerCount
= pMxDoc.FocusMap.LayerCount
If pLayerCount
> 0 Then
ICommand_Enabled
= True
Else
ICommand_Enabled
= False
End If
End Property

Private Property Get ICommand_HelpContextID() As Long
ICommand_HelpContextID
= 1234
End Property

Private Property Get ICommand_HelpFile() As String

End Property

Private Property Get ICommand_Message() As String
ICommand_Message
= "This is my custom command"
End Property

Private Property Get ICommand_Name() As String
ICommand_Name
= "HSCustomTool_MyCommand"
End Property

Private Sub ICommand_OnClick()
MsgBox
"Clicked on my command"
End Sub

Private Sub ICommand_OnCreate(ByVal hook As Object)
pApp
= hook
End Sub

Private Property Get ICommand_Tooltip() As String
ICommand_Tooltip
= "HSCommand"
End Property

      编译该工程,以建立dll文件。至此,该动态链接库就建立好了。

      下面在ArcMap中使用刚建立的基于ICommad接口的自定义命令。启动ArcMap,Tools>Customize,弹出Customize对话框,切换到Toolbars选项卡,新建一个Toolbar。如下图所示:

 

      切换到Commands选项卡,单击Add from file 按钮,导航至刚才建立的dll文件,这个自定义的命令就添加至ArcMap中了。在Categories列表框中找到HSCustomTools,在Commands列表框中找到HSCommand,将其拖拽至刚建立的自定义工具栏上。

    OK,向ArcMap中添加数据,测试一下自定义命令吧! ^_^ 效果如下:

  

    本文重点在于对“使用动态链接库组件进行ArcGIS开发”这一开发方式进行介绍性演示,在开发DLL组件功能上没有深入探究。可根据实际需要扩展DLL功能。

原文地址:https://www.cnblogs.com/hans_gis/p/1887678.html