阅读:19678回复:31
MAPGIS二次开发基础知识
<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> |
|
|
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> |
|
2楼#
发布于:2009-03-07 22:27
<img src="images/post/smile/dvbbs/em01.gif" />
|
|
3楼#
发布于:2008-08-31 22:25
<P>如何将打开的MAPGIS工程中某个文件激活(可编辑)?</P>
<P>如何将此激活的文件与EDITVIEW控件中的工作区相关联?</P> <P>请教诸位》》》》</P> |
|
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> |
|
5楼#
发布于:2008-04-14 21:42
呵呵,的确是好人啊<img src="images/post/smile/dvbbs/em01.gif" />
|
|
6楼#
发布于:2007-10-16 23:31
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em02.gif" />
|
|
7楼#
发布于:2007-06-19 15:47
二次开发园地为什么打不开
|
|
8楼#
发布于:2007-04-07 22:03
<img src="images/post/smile/dvbbs/em05.gif" />
|
|
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" />
|
|
上一页
下一页