经过反复的尝试,已经实现了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