NorthSnow HOME

北风吹来,雪花飘飘;一片一片,好像鹅毛;飘呀飘呀,地上白了。

原创 pb调用.net组件的实践收藏

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

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

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

http://blog.csdn.net/precipitant/archive/2007/09/07/1775964.aspx

  封装的源代码如下:

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

COM GUID

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



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


    
Public 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() 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 - 11).ToString, "")
    
End Function

    
''' <summary>
    '''返回数组
    ''' </summary>
    ''' <returns>返回生成的数组</returns>
    ''' <remarks>二维数组储存key/value对</remarks>
    Public 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中就可以调用了,调用方法请参见:

http://blog.csdn.net/precipitant/archive/2007/09/05/1773126.aspx

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
=+ "~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
=+ "~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 



发表于 @ 2007年09月07日 19:29:00|评论(loading...)

新一篇: Silverlight 将是 Flash 的终结者 | 旧一篇: CSDN个人空间的一个BUG

Csdn Blog version 3.1a
Copyright © 塞北的雪