经过反复的尝试,已经实现了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 CodeForComClass 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中就可以调用了,调用方法请参见:
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=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



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