gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:18838回复:31

MAPGIS二次开发基础知识

楼主#
更多 发布于:2004-10-26 21:02
<b>
</b>一、手动注册组件与注销组件


<P>COM以及客户应用程序所需的、用来定位组件及对组件进行实例化的信息存储在
Windows的注册表(Registry)里。因此,在使用组件之前要对组件进行注册,
只有成功注册才能引用该组件,其具体步骤为:</P>
<P>1.将包容组件的DLL文件放入MAPGIS PROGRAM 目录下,假设物理路径为:
   D:\mapgis65\program\ MapGisBasCom1.dll</P>
<P>2.运行注册表程序注册组件 Windows开始菜单-〉运行:
   regsvr32 D:\mapgis65\program\MapGisBasCom1.dll 注册成功与否将有对话框弹出。</P>
<P>3.注销该组件方法为:
   regsvr32 /u D:\mapgis65\program\MapGisBasCom1.dll</P>
<P>二、Visual Basic中嵌入对象类型库</P>
<P>为了使Visual Basic能够访问MAPGIS对象定义,应该在Visuai Basic项目或模块中嵌入
MAPGIS对象类型库。如果想把一个Visual Basic对象声明为MAPGIS对象类型,要求嵌入
MAPGIS对象类型库, 如果想把一个Visual Basic对象声明为一般Object类型,就不必嵌
入MAPGIS对象。</P>
<P>为了在项目中嵌入MAPGIS对象类型库,通常执行这些步骤:
从Project(工程)菜单, 选择References, References对话框出现, 选中复选框嵌入
MapGisBasCom1 Type Library文件。这要求VisualBasic环境或代码模块编辑器是活动
的,正在运行。</P>
<P>三、使用MAPGIS对象</P>
<P>可以使用Visual Basic编写使用MAPGIS对象的程序。在Visual Basic程序中使用MAPGIS对
象所要求的步骤是:</P>
<P>1.嵌入MAPGIS对象类型库。</P>
<P>2.建立一个MAPGIS对象。</P>
<P>3.使用MAPGIS对象和包含的其他对象。</P>
<P>4.释放MAPGIS对象。</P>
<P>使用一个句点(.)把对象变量与该对象的属性、方法和集合分开。</P>
<P>四、使用C++和COM函数</P>
<P>可以使用C++和COM函数编写使用MAPGIS对象的程序。在C++程序中使用
MAPGIS对象所要求的步骤是:</P>
<P>1.嵌入MAPGIS对象和COM头文件,并链接到COM库。</P>
<P>2.初始化C0M库。</P>
<P>3.建立一个MAPGIS对象。</P>
<P>4.使用MAPGIS对象和包含的其他对象。</P>
<P>5.释放MAPGIS对象。</P>
<P>6.解除C0M库的初始化。</P>
<P>使用成员选择运算符(->)把“对象指针”变量与属性、方法和集合函数分开。
嵌入MAPGIS对象
对MAPGIS对象编程的第一步是在项目中嵌入合适的类型库或头文件。
完整的MAPGIS对象类型库包含在MapGisBasCom1.h文件中,这个文件的默认路径:
D:\mapgis65\include\MapGisBasCom1.h
类型库含有关于所有MAPGIS对象、属性和方法的信息。</P>
<P>五、COM的调用</P>
<P>MAPGIS对象包括ANSI和Unicode这两个定制接口。使用ANSI接口时,所有MAPGIS对象字符
串都是每个字符一个字节的ANSI字符串。使用Unicode接口时,所有MAPGIS对象字符串都
是每个字符两个字节的Unicode字符串。所有MAPGIS对象字符串都使用====BSTR字符串数
据类型。</P>
<P>默认情况下使用ANSI定制接口和ANSI ====BSTR字符串。如果想使用Unicode定制接口和
Unicode =====BSTR字符串,在嵌入所有头文件之前必须定义UNICODE和_UNICODE。</P>
<P>例如:
#define UNICODE
#define _UNICODE</P>
<P>在字符串值两端使用TEXT(“str”)宏。默认情况下,这些是ANSI“Str”字符串。在定
义了UNICODE和_UNICODE时,这些是Unicode L“Str”字符串。在32位0LE中,所有BSTR字
符串是Unicode字符串。为了使C++程序能够访问MAPGIS对象定义,除了嵌入Windows和
0LE头文件之外,还必须嵌人MAPGIS==.H和MAPGIS==.H头文件。默认情况下,MAPGIS头文
件位于======\INCLUDE目录中。</P>
<P>Visual C++项目的Include设置或INCLUDE环境变量应指向含有这些文件的目录。
必须嵌入以下头文件:
1. MapGisBasCom1_i.c
2. MapGisBasCom1.h</P>
<P>例如:
#include "MapGisBasCom1_i.c"
#include "MapGisBasCom1.h"</P>
<P>Visual C++项目的Library设置或LIB环境变量应指向含有这些文件的目录。</P>
<P>六、初始化COM库</P>
<P>在程序能使用MAPGIS对象之前,必须初始化C0M库。</P>
<P>Visual Basic
MAPGIS程序不必初始化COM,Visual Basic自动初始化C0M库。</P>
<P>C++
所有MAPGIS COM函数都返回一个HRESULT值,这个值含有关于MAPGIS COM函数的成功或失败
的信息。可以声明单个HRESULT变量并重复利用它。例如:
HRESULT hr;
在调用任何MAPGIS或COM函数之前, MAPGIS程序必须使用COM CoInitialize函数初始化COM
库。例如:
hr=CoInitialize(Null);
必须把NULL传递给CoInitialize。</P>
<P>七、建立MAPGIS对象</P>
<P>MAPGIS组件的核心是MAPGIS对象。</P>
<P>Visual Basic
在Visual Basic 中有2个方法用于建立MAPGIS对象,这2个方法都涉及使用Dim 语句声明
特定类型的对象变量。
特定的MAPGIS对象类型
常用的方法(如果使用的Visual Basic 版本支持它)是使用Dim语句声明特定MAPGIS对象
对象类型的对象变量,这个方法要求MAPGIS类型库包括在Visual Basic项目中。为了实际
建立一个MAPGIS对象的新实例.可以在Dim语句中使用New关键字(如果使用VisualBasic版
本支持它的话)或者使用CreateObject函数。</P>
<P>例如,使用New关键字创建新的MAPGIS对象的语句是:</P>
<P>Dim ldot As New L_DOT</P>
<P>例如,使用CreateObject函数声明和创建一个新的MapGis对象:</P>
<P>Dim ldot As L_DOT
Set ldot = CreateObject("MapGisBasCom1.L_DOT")</P>
<P>有些版本的Visual Basic 使用虚函数表绑定(vtable-binding),或早期绑定。直接使用
MAPGIS定制接口(不通过COM IDispatch接口),产生最好的性能。</P>
<P>有些版本的Visual Basic使用推迟绑定的形式,叫做分派ID绑定(dispID,binding),它使
用COM IDispatch。IDispatch ::Invoke 函数与在MAPGIS类型库中包括的dispID一起使
用。这种方法使应用的性能没有使用New关键字那样快.但比使用Object类型快。</P>
<P>八、在C++中建立MAPGIS对象</P>
<P>在C++中只有一种方法建立MAPGIS对象,声明合适的MAPGIS“对象指针"类型的对象变量,然
后使用COM CoCreateInstance函数建立MAPGIS对象的新实例。把以下参数传递给CoCreateInstance:
1. MAPGIS对象的类ID
2. NULL
3. CLSCTX_INPROC_SERVER
4. MAPGIS对象的接口ID
5. MAPGIS “对象指针”变量的地址(使用;运算符的地址)。
例如,要建立一个新的ID_Dot  MAPGIS对象:
 IPntArea *ptPAi;
 hr=CoCreateInstance(CLSID_PntArea,
      NULL,
      CLSCTX_INPROC_SERVER,
      IID_IPntArea,
       (void**);ptPAi);
注意:一个多线程程序,必须串行化对MAPGIS对象的所有访问,以避免重入.</P>
<P>九、函数库名称
函数库名称                            c,c++说明文件
工作区基础函数                        Win_area.h
矩形图框函数                          frmdll32.h
投影类库                              projdll.h
控制点操作                            w32_cpnt.h
状态栏显示点转换以及工作区投影函数    cordcvt.h
图形显示输出                          Map_out.h
                                      win_out.h
工程对象操作函数以及拼版文件操作函数  Map_prj.h
编辑工程文件                          Prj_Disp.h
图例和工程文件操作函数                Project.h
图像显示函数                          Mapdisp.h
图像编辑函数                          Mapedit.h
输入编辑子系统类库                    CGisEdit.h
                                      CPrjEdit.h
拓扑操作函数                          Gistopo.h
图元以及剪贴板操作函数                clippaste.h
UNDO 处理数据及成员函数               gistool.h
窗口操作函数                          CGisView.h
GisView对象函数                       Win_oper.h
空间分析函数                          Spc_anly.h
各种头文件                            MapGis.h</P>
<P>十、怎样用vb对mapgis进行二次开发,不知道怎样将二者联系起来
       Vb开发三种方式:
       MAPGIS API开发库
       通过调用应用程序接口直接编程</P>
<P>       MAPGIS 可视控件(ocx)</P>
<P>       MAPGIS 组件开发(com)
       通过控件和组件编程</P>
<P>       如何创建MAPGIS对象
       Dim workai As NEW PntArea
       Dim workai As PntArea
       Set workai = CreateObject(“MapGisBasCom1.pntarea”)
       三种方式可以互为补充。</P>
喜欢0 评分0
hgzyyl
路人甲
路人甲
  • 注册日期2009-01-16
  • 发帖数100
  • QQ
  • 铜币353枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2010-09-14 08:39
<TABLE fixed; WORD-BREAK: break-all" border=0 width="95%" align=center height="85%">

<TR>
<TD 12pt; FONT-SIZE: 9pt" height="100%" vAlign=top width=*><IMG src="http://www.gisempire.com/bbs/Skins/Default/topicface/face715.gif"> <B></B><BR>
<P>好人呀,够我消化好久的</P></TD></TR></TABLE>
举报 回复(0) 喜欢(0)     评分
芜菁
路人甲
路人甲
  • 注册日期2008-04-20
  • 发帖数21
  • QQ
  • 铜币152枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2009-03-07 22:27
<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
bbcddc
路人甲
路人甲
  • 注册日期2004-08-07
  • 发帖数20
  • QQ
  • 铜币127枚
  • 威望-1点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
3楼#
发布于:2008-08-31 22:25
<P>如何将打开的MAPGIS工程中某个文件激活(可编辑)?</P>
<P>如何将此激活的文件与EDITVIEW控件中的工作区相关联?</P>
<P>请教诸位》》》》</P>
举报 回复(0) 喜欢(0)     评分
ybbean
路人甲
路人甲
  • 注册日期2007-05-10
  • 发帖数11
  • QQ
  • 铜币151枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2008-07-29 22:31
<P>高手,帮一下忙:</P>
<P>    我要在同一个地图文档中打开几个要素层,应该怎么样编码?</P>
<P>    我的编码如下:</P>
<P>Imports mapXBase<BR>Imports mc_basObj7Lib<BR>Imports mc_basXcls7Lib</P>
<P>Public Class mainform<BR>    Dim m_map As IXMap                            '地图<BR>    Dim m_FCLs As mcFeatureCls                    '要素类<BR>    Dim m_GDBSvr As mcGDBServer                   '数据源<BR>    Dim m_GDB As mcGDataBase                      '数据库<BR>    Dim m_pMapLayer As IXMapLayer                 '图层</P>
<P>    Private Sub mainform_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<BR>        myview.WorkSpace = myWork.ToInterface<BR>        m_GDBSvr = mywork.Connect("MapGisLocal", "", "")<BR>        If m_GDBSvr IsNot Nothing Then<BR>            m_GDB = m_GDBSvr.gdb("sample")<BR>            If m_GDB IsNot Nothing Then<BR>                m_FCLs = m_GDB.OpenFClsByName("ku6_1.wl")<BR>                If m_FCLs IsNot Nothing Then<BR>                    mywork.AddMap("我的地图", m_map)<BR>                    m_map.Visible = True<BR>                    mywork.AddClass(m_FCLs, m_pMapLayer, m_map)<BR>                    If m_pMapLayer IsNot Nothing Then<BR>                        m_pMapLayer.Visible = True<BR>                        m_pMapLayer.Active = True<BR>                        myview.Restore()<BR>                    End If<BR>                End If<BR>            End If<BR>        End If</P>
<P>    End Class</P>
举报 回复(0) 喜欢(0)     评分
fengzigis
路人甲
路人甲
  • 注册日期2008-02-20
  • 发帖数66
  • QQ
  • 铜币239枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2008-04-14 21:42
呵呵,的确是好人啊<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
lym0813
路人甲
路人甲
  • 注册日期2004-06-14
  • 发帖数284
  • QQ
  • 铜币8枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2007-10-16 23:31
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
nmydm
路人甲
路人甲
  • 注册日期2007-06-08
  • 发帖数6
  • QQ
  • 铜币117枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2007-06-19 15:47
二次开发园地为什么打不开
举报 回复(0) 喜欢(0)     评分
whmwxhanshan123
路人甲
路人甲
  • 注册日期2006-06-17
  • 发帖数3108
  • QQ
  • 铜币6445枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2007-04-07 22:03
<img src="images/post/smile/dvbbs/em05.gif" />
举报 回复(0) 喜欢(0)     评分
zslzsl
路人甲
路人甲
  • 注册日期2004-09-07
  • 发帖数91
  • QQ254646505
  • 铜币347枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2007-04-06 01:22
<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em04.gif" /><img src="images/post/smile/dvbbs/em06.gif" /><img src="images/post/smile/dvbbs/em08.gif" />
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部