专题:vfp传递对象给vb.net.请讨论
文章中的vfp是vfp8 ,vs.net 第一版的框架,win2003 server
传递对象的机制:vb.net调用vfp的com
为什么要使用vfp写com,这个vfp的帮助有写原因.简单的说,vfp作为中间层,处理数据是高效的,高效表现于数据的处理能力和写中间层的简介方便,快速.
在vb.net中,调用vfp写的com,如果vfp的接口方法返回结果是vfp的对象类型,vb.net中如何识和使用这些对象呢?譬如返回一个collection类功能的对象?
今天我在这些抛砖引玉,讨论vfp的com 以及和vb.net的关系.下面以传递类似collection类功能的对象为例子.介绍以前先简单介绍collection的功能,collection类的其中一个很重要的功能:一个元素的集合.这个集合可以是记录集合,可以是listbox的集合,等等,并提供索引等功能.
如果在vb.net和vfp中传递不多不少的数据的时候我不使用xml或者其他数据类型,而使用对象,我们如何处理,当然这这是传递对象的一个功能而已.
下面我们给出代码
第一部分是vfp写的com的代码:
*- 这是一个主类
*- 用于返回对象到vb.net ,使用GetTestObj方法
*- 用于测试vb.net返回到vfp的对象,使用GetStringFromNetObject方法
*- 请注意oTCol = NEWOBJECT("testcom.mycollection"),这里使用了com创建了collection类功能的对象.为了在vb.net中转换类型,将object转换到下面指定的mycollection组件类型.当然这个转换相信在delphi等也可以转换的.
*- 第二个类是mycollection,象vb.net提供类型识别.其他语言调用vfp的对象也只能通过com形式.
DEFINE CLASS mycom as Custom OLEPUBLIC
DIMENSION GetTestObj_COMATTRIB[4]
GetTestObj_COMATTRIB[1] = 0x100000
GetTestObj_COMATTRIB[2] = "get vfp object"
GetTestObj_COMATTRIB[3] = "GetTestObj"
GetTestObj_COMATTRIB[4] = "collection"
FUNCTION GetTestObj() As testcom.mycollection
LOCAL oTCol As Collection
oTCol = NEWOBJECT("testcom.mycollection")
oTCol.Add("apple")
oTCol.Add("Banan")
oTCol.Add("Orange")
oTCol.Tag = "myname"
RETURN oTCol
ENDFUNC
FUNCTION GetStringFromNetObject(toObj As Collection ) As String
LOCAL lcS As String
lcS = [norm]
LOCAL oe As Exception
TRY
lcS = toObj.Class
CATCH TO oe
lcS = "wrong" + oe.Message
ENDTRY
RETURN lcS
ENDFUNC
ENDDEFINE
DEFINE CLASS mycollection As Collection OLEPUBLIC
ENDDEFINE
第二部分是vb.net的客户端测试代码
测试的环境是创建一个窗口,和在窗口上添加一个listbox和一个按钮,并在按钮下添加一下代码.代码的结果是在listbox创建水果列表.水果列表是由mycom返回的collection对象获得的.那么对于表的记录也可以通过这样传递....
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim oTC As New mycom()
Dim lc As String
Dim oCol As mycollection
oCol = CType(oTC.GetTestObj(), mycollection)
lc = oCol.Class
Dim i As Int32 = 0
For i = 3 - 2 To oCol.Count
Me.ListBox1.Items.Add(oCol.Item(i))
Next
Try
MsgBox(lc)
Catch oe As Exception
MsgBox(oe.Source())
End Try
End Sub
总结;如果采用多层结构的系统,那么使用vfp写中间件的时候,有时候回传递对象,会涉及远程调用等技术.对于前端有可能使用vfp,有时候会使用vb.net等等...处理好中间层对于产品的多样化有好处.有些客户可能不喜欢vfp写的界面..作为一些引子,先到这儿/
问题点数:0、回复次数:1Top
1 楼foxbuilder(狐思乱想)回复于 2003-06-02 15:34:56 得分 0
不止是vfp8,vb或其它工具写的com,在.net里应该都可以这样.
另外我发现,带com组件引用至.net时会作一些相应转换(.net将以此com组件为基类派生出一个新类供.net使用, 新类增加dock,tag(object)等.net属性和方法), 相应在bin上当下会增相一个dll文件.
如引用excel时,bin目录增加Interop.Excel.dll文件.
引用vsflex7.ocx 时,会增加AxInterop.VSFlex7.dll文件
vsFlex7.ocx 是com组件,而AxInterop.VSFlex7.dll是.net组件,从vsFlex7.ocx派生而来, 当然,待到使用AxInterop.VSFlex7.dll时,你还是少不了vsFlex7.ocx,它扮解一个基类角色.
Top




