0
点赞
收藏
分享

微信扫一扫

pb调用.net组件的实践


  经过反复的尝试,已经实现了PB7.0调用vs.net 2005 开发的组件的方法。虽然还有一点技术问题没有解决,但是主要的难点都已经攻克。本文将发一个刚刚完成的小例子来说明一下。

  本例用的是 pb7.0 和 vs.net2005 +vb.net

  首先将.net组件封装成 com,方法请参见:


  封装的源代码如下:

< 
  ComClass(CodeForCom.ClassId, CodeForCom.InterfaceId, CodeForCom.EventsId) 
  > 
   _
 
  Public 
    
  Class CodeForCom 
  Class CodeForCom

COM GUID#Region "COM GUID"
    ' 这些 GUID 提供此类的 COM 标识 
    ' 及其 COM 接口。若更改它们,则现有的
    ' 客户端将不再能访问此类。
    Public Const ClassId As String = "225d6048-672b-42c0-a623-6688596592b0"
    Public Const InterfaceId As String = "4812e4bd-0aa8-4716-a306-6d774d7cdc72"
    Public Const EventsId As String = "a47bfff0-24ae-45ee-809a-2664efcd1777"
#End Region

    ' 可创建的 COM 类必须具有一个不带参数的 Public Sub New() 
    ' 否则, 将不会在 
    ' COM 注册表中注册此类,且无法通过
    ' CreateObject 创建此类。
    Public Sub New()Sub New()
        MyBase.New()
    End Sub


    Public Function liu()Function liu() As String
        Return "liujincai is a dog"
    End Function

    Public Function getCodeList()Function getCodeList() As SortedList
        Dim sl As SortedList
        Dim crc As New CrcDbConnection.CrcDbConnection
        crc.ConnDatabase()
        sl = crc.GetCodeSortList
        Return sl
    End Function
    ''' <summary>
    ''' 返回字符串
    ''' </summary>
    ''' <returns>返回拼接成字符串的编码信息</returns>
    ''' <remarks>key;value|key;value|……</remarks>
    Public Function getCodeString()Function getCodeString() As String
        Dim sl As SortedList
        sl = getCodeList()
        Dim strCode As New System.Text.StringBuilder
        If Not sl Is Nothing Then
            Dim sItem As System.Collections.DictionaryEntry
            For Each sItem In sl
                strCode.Append(sItem.Key)
                strCode.Append(";")
                strCode.Append(sItem.Value)
                strCode.Append("|")
            Next
        End If
        Return IIf(strCode.Length > 0, strCode.Remove(strCode.Length - 1, 1).ToString, "")
    End Function
    ''' <summary>
    '''返回数组
    ''' </summary>
    ''' <returns>返回生成的数组</returns>
    ''' <remarks>二维数组储存key/value对</remarks>
    Public Function getCodeArray()Function getCodeArray() As String(,)
        Dim arrCode(,) As String
        Dim i As Long = 0

        Dim sl As SortedList
        sl = getCodeList()
        ReDim arrCode(2, sl.Count)
        If Not sl Is Nothing Then
            Dim sItem As System.Collections.DictionaryEntry
            For Each sItem In sl
                arrCode(0, i) = sItem.Key
                arrCode(1, i) = sItem.Value
                i += 1
            Next
        End If
        Return arrCode
    End Function
End Class

 上面的代码是为了封装一个名为 CrcDbConnection.CrcDbConnection 的 .net 组件。这个组件的源代码我们就不公布了。这个组件返回的是一个 SortedList 。而 这个类型无法被 pb 识别。所以进行了处理。

用getCodeString 方法返回一个 拼接的字符串

用getCodeArray 方法返回一个 二维数组

由于CrcDbConnection.CrcDbConnection 被 封装成了 名为 CodeForCom.CodeForCom 的 com,所以PB中就可以调用了,调用方法请参见:


pb 中相应的调用代码如下:

1,返回数组


int      intValue   
oleobject   objOle   
objOle   = 
  create   OLEObject   
intValue   = 
  objOle.connecttonewobject( 
  " 
  CodeForCom.CodeForCom 
  " 
  )

   string 
   u[ 
  20 
  , 
  2 
  ]
   string 
   v
u   = 
  objOle.getcodearray()
   int 
   i,j
   for 
   i 
  = 
  1 
    
  to 
   upperbound(u, 
  2 
  )
       for 
   j 
  = 
  1 
    
  to 
   upperbound(u, 
  1 
  )        
            v   = 
  v  
  + 
    
  " 
  ~r~n 
  " 
    
  + 
    u[j,i]     
       next 
  
   next 
  
mle_1.text   = 
  v

可以返回结果。但是一个比较严重的问题还没有解决。那就是部分汉字编成了乱码。正在研究中……

2,返回字符串

int      intValue   
oleobject   objOle   
objOle   =   create   OLEObject   
intValue   =   objOle.connecttonewobject( 
  " 
  CodeForCom.CodeForCom 
  " 
  )

   string    v
   int    i
   string    c
c   =   objOLe.getcodestring()

   string    oItem[]
   split   (c, 
  " 
  | 
  " 
  ,ref oItem)
   for    i 
  = 
  1 
    
  to 
   upperbound(oItem)
    v   =   v  
  + 
    
  " 
  ~r~n 
  " 
    
  + 
   oItem[i]
   next   
mle_2.text   =   v

可以返回结果,看不过本例只进行了一级的猜分,得到的每一个字符串实际上是一组 key/value 用 ;  分隔开的,比如 northsnow;塞北的雪    如果你要直接访问到 key 或者 value 还要进行一次猜分。另外也有一个比较严重的问题,就是返回的字符串长度,比实际的短,不知道是如何被截去了。也正在研究中……

另外PB程序中还用到了一个自定义函数,用于猜分字符串成数组,代码如下

 

函数定义为:public function long split (string str1, string sep, ref string arrR[])

代码如下:

long    lPos    =     
  1 
   
   long    lFind 
   string    arrNull[]
   if       isnull 
  (str1)  
  or 
    
  isnull 
  (sep)  
  then 
  
    setnull(lPos)
    return lPos
   end       if 
  
arrR[]    =    arrNull[]
lPos    =       1 
  
lFind    =    pos(upper(str1), upper(sep))
   do       while 
   lFind  
  > 
    
  0 
  
    arrR[lPos]    =       left 
  (str1,lFind  
  - 
    
  1 
  )
    str1    =       right 
  (str1, 
  len 
  (str1)  
  - 
   lFind  
  - 
    
  len 
  (sep)  
  + 
    
  1 
  ) 
    lFind    =    pos(upper(str1), upper(sep)) 
    lPos    =    lPos    + 
    
  1 
   
   loop   
arrR[lPos]    =    str1 
return lPos


举报

相关推荐

0 条评论