默认头像
路人甲
路人甲
  • 注册日期2004-04-24
  • 发帖数24
  • QQ
  • 铜币186枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2361回复:6

[求助]如何在vb中运行.MBX文件?

楼主#
更多 发布于:2004-11-16 09:59

各位大哥:

      小弟想在vb中运行.MBX文件(MapBasic的可执行文件),使用了WinExec函数和Shell函数,但是他们的参数都要是.EXE文件,所以现在正在郁闷中。请教各位高手,有什么办法可以解决。我倒是想了几个,比如将MapBasic代码编译成.EXE文件,或者先运行MapInfow.exe文件再运行自己编的.MBX……但是,具体如何实现以及其他更好的方法还是要教各位了。

     先谢过了。谢谢。

喜欢0 评分0
我们是一个飘然的梦; 我们是一缕飞翔的风; 我们是一段没有发生的回忆!
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2004-11-16 15:06
mapinfo可以在后台运行了
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-04-24
  • 发帖数24
  • QQ
  • 铜币186枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-11-18 10:03

请教具体实现方法是什么?能不能讲的更具体些?

我们是一个飘然的梦; 我们是一缕飞翔的风; 我们是一段没有发生的回忆!
举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
3楼#
发布于:2004-11-22 16:27

下面的程序段中给出了实现回调时PowerBuilder客户程序的处理过程。该处理过程使用了MapBasic编写的mbserver.mbx程序。在MapBasic程序中保存事件信息的变量为g_SelTabName,而g_PbHWnd是MapBasic程序中用来接收PowerBuilder客户程序窗口句柄的全局变量。

//在MapInfo服务器中运行MapBasic应用程序

MapInfo.Do("Run Application ~"" + gs_AppDir + "DataFusion.mbx~"")

//创建对MapBasic应用程序进行控制的OLE自动化对象

MBAppOleObject = Create OleObject

MBAppOleObject = MapInfo.MBApplications.Item(1)

//传递PowerBuilder客户程序中的窗口句柄给MapBasic应用程序

//以便MapBasic应用程序将返回给PowerBuilder客户程序

MBAppOleObject.MBGlobals.Item("g_pbhwnd_bg").Value = String(Handle(this))

由下面代码所示的PowerBuilder客户程序就可以在窗口w_map的用户自定义事件ue_SelectionMade中处理地图窗口事件:

//在PowerBuilder客户程序的用户自定义事件中使用MBAppOleObject对象获取回调信息

ls_MI_CommandInfo = MBAppOleObject.MBGlobals.Item("g_CommandInfoString").Value

GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
4楼#
发布于:2004-11-22 16:28

MapBasic是MapInfo提供的用户系统开发工具,它具有对地图对象的管理、对含有地图对象的MapInfo表的管理等方面的强大功能。

在将MapInfo地图集成到PowerBuilder的开发应用中,MapBasic不仅仅能用来实现回调,还可实现其它诸多功能。例如,在开发过程中经常会遇到需要保存地图对象类型的中间结果的问题,而在PowerBuilder中没有与之对应的数据类型,又难以通过MapInfo OLE自动化对象的方法和属性实现等诸如此类的问题,若利用MapBasic应用程序以及使用它的OLE自动化对象MBApplications的方法和属性来解决,可以达到事半功倍之效果。

与MapInfo OLE自动化对象相似,MapBasic的OLE自动化对象MBApplications也有自己的Do方法和Eval方法。每当PowerBuilder客户程序调用它们时,MapInfo就会自动调用MapBasic的保留过程RemoteMsgHandler()或RemoteQueryHandler()过程,并可以在过程中通过CommandInfo(CMD_INFO_MSG)得到调用Do方法或Eval方法的参数。

以下代码运用MBApplications的Do方法,实现改变当前选中地图对象的颜色:

//要求将当前选中地图对象的颜色改为兰色

MBAppOleObject.Do("Blue")

MapInfo将自动调用RemoteMsgHandler()过程:

Sub RemoteMsgHandler()

Dim MyObject As Object

'获取并分析Do方法的参数

CmdInfoStr = CommandInfo(CMD_INFO_MSG)

'改变地图对象的颜色

If CmdStr= "Blue" then

MyObject = Selection.obj

Alter Object MyObject Info 2, MakeCustomSymbol ("Towe1-32.bmp", RGB(0,0,255), 18, 2)

Update Selection set obj = MyObject Where RowID = 1

End If

End Sub

MBApplications的Eval方法的调用与Do方法的类似,只不过MapInfo将自动调用RemoteQueryHandler()过程,并要求返回一个结果。

GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
5楼#
发布于:2004-11-22 16:32

在VB应用程序里实现对另一个应用程序(MapInfo)的访问,利用前面所提到的OLE Automation技术,把MapInfo作为服务器,VB应用程序作为客户机,可以无缝地实现集成MapInfo对象于VB应用程序中。

具体实现步骤如下:

(1)首先定义两个对象:MapInfo与theResponde,即在程序里添加两行:

Public MapInfo As Object '*创立指向MapInfo的对象

Public theResponder As Object '*创立本地对象,MapInfo将把信息返回给它

(2) 然后再添加一个子程序InitializeMapInfoConnection(),用于实现同MapInfo的通信。该子程序在后台创立一个用于通信的MapInfo实例;一个本地在此VB应用程序的类MIResponder的对象的实例,即用于接受MapInfo返回应用程序信息的实例。

具体程序如下:

Public Sub InitializeMapInfoConnection()

On Error GoTo userCancelled

Set MapInfo = CreateObject("MapInfo.Application") '*创立MapInfo对象

MapInfo.do "Set Application Window " ; Mapwin.hwnd

MapInfo.do "Set Window Info Parent " ; Mapwin.hwnd

Set theResponder = New MIResponder '*创立theResponde对象

MapInfo.SetCallback theResponder

MapInfo.do "Run Application " + """" + WORKDIR + "\getarea.mbx" + """"

MapInfo.do "Create Menu ""MapperShortcut"" ID 17 As ";"""" + "前一视图"_ + """" + " ID 1002 Calling 806, " ; """" + "改变视图" + """" + " ID 1002 Calling_ 805"

……

thereIsAMap = False '*初始化,表示没有地图窗口

mapWinID = 0 '*表示没有窗口

MapInfo.runmenucommand M_TOOLS_SELECTOR '*激活MapInfo的选择工具

Exit Sub

userCancelled:

MsgBox "系统初始化失败,请查看 MAPINFO 是否正确安装!"

End

(3) 现在MapInfo已成为VB应用程序的一个对象,因此可调用MapInfo对象的方法及设置其属性来实现对地图的复杂操作。

具体程序(略)

GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-11-05
  • 发帖数11
  • QQ
  • 铜币45枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-12-23 19:12

谢谢老大的教导

举报 回复(0) 喜欢(0)     评分
默认头像

返回顶部