GeoMedia是美国Intergraph公司开发的桌面GIS平台,至于GeoMedia的介绍我在这里不多说,可以到Intergraph的网站www.intergraph.com/geomedia/或者通过Google了解更多详细情况。在这里所提到的Geomedia均指GeoMedia Professional 4.0 或 5.0。

使用GeoMedia开发GIS应用程序,需要了解一些GeoMedia平台中的一些术语和概念,请参见。在GeoMedia的帮助文档GeoMedia Professional Object Reference中可以找到很多VB例子,在这里我主要介绍用VC++6.0如何开发基于GeoMedia的应用程序。

为了让大家有个初步的概念和便于理解的环境,我先不介绍一些平台相关的术语和特性,而是直接描述如何用VC++6创建一个嵌入GeoMedia平台中运行的自定义工具程序。

为了你在下面的过程中不碰到什么不必要的麻烦,请先安装好VC++6.0英文版+SP6补丁。

好,开始进入正题。

第一步
打开VC6,创建工程。
工程类型为ATL COM AppWizard,我在这里将工程名字取为TestCmd。Next到下一步设置我们创建的ATL COM组件类型为Dynamic Link Library (DLL),并且选择MFC支持(这是为了使用大家比较熟悉的界面控制方式,避免对本主题内容理解上的障碍,如果你对ATL/WTL比较熟悉,那么完全可以不选择MFC的支持)。如下图:

第二步
工程创建好了之后,我们接下来要做的第一件事就是创建一个ATL COM对象,选择菜单Insert -> New ATL Object,在ATL Ojbect Wizard对话框中选择Objects,类型为Simple Object。在Wizard的下一步中,我们需要设置ATL Object的名字,我这里设置为TestCmdCom。在attributes标签页中设置线程模型(Threading Model)选择为单线程(Simgle), 接口(Interface)设置为双接口(Dual),也就是支持IDispatch和vtable绑定。 Aggregation设置为NO,也就是不需要聚合支持。另外勾选Support ISupportErrorInfo,以实现ISupportErrorInfo接口,其他的不需要选择。如下图:

第三步
在IDE自动生成的TestCmdCom.h文件中加入如下接口声明:

接口声明


在自动生成的TestCmdCom.cpp文件中加入如下接口定义:

接口定义


第四步
在TestCmd.idl文件中的
interface ITestCmdCom : IDispatch
{
};
中加入接口描述,完成后的格式如下:
接口描述

第五步:创建界面
在这一篇里,我们实现一个简单的功能:枚举当前的所有连接并显示在一个ComboBox中,先在工程中添加一个对话框(我在这里命名为CMainDlg),然后在对话框中添加一个ComboBox和一个Button,在Button的事件中我们添加如下代码:
OnButton1

完成这些后,我们需要在CTestCmdCom的Activate方法中启动该对话框,代码如下:
CMainDlg mainDlg;
mainDlg.SetGMApp(m_spApplication);
mainDlg.DoModal();


第六步:插件程序的注册安装
我们需要使用GeoMedia Pro自带的工具installusrcmd来注册我们生成的程序,使用这个工具需要我们创建一个ini文件来描述注册信息,格式如下:
[TestCmdCom]
ProgID
=TestCmd.TestCmdCom
CommandType
=0
EnableMask
=43008
ListenerMask
=0
IsModal
=1
Description
=GM Tool Test
ToolTip
=GM Tool Test
SmallMonoBitmapPath
=
SmallColorBitmapPath
=
LargeMonoBitmapPath
=
LargeColorBitmapPath
=
其中EnableMask的值是指什么状态下,该控件可以被使用(Enable),这个值可以用GeoMedia自带VB程序创建想到来生成;IsModal值为1表明我们的界面是模态对话框。

然后,用一下批处理来注册我们写好的插件:
regsvr32 TestCmd.dll /s
"D:\Program Files\GeoMedia Professional\Program\installusrcmd" /prod "GeoMedia Professional" TestCmd.dll TestCmd.ini

注册后,我们就可以在GeoMedia中的自定义工具中选择使用该工具了。

最后补充一句,发布程序的时候,使用MinDependency方式,这样就可以避免在没有安装VC6的机器上不能启动该插件工具的问题。

该文章中代码都可以在这里下载得到:TestCmd VC6 Project