我用WINSOCK的UDP发的数组 是不是因为Safearray? 具体怎么做呢Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Dim a(1 To 5) As Long Private Sub Command1_Click() For i = 1 To 5 a(i) = 5 Next Dim b() As Byte ReDim b(1 To 20) As Byte CopyMemory ByVal VarPtr(b(1)), ByVal VarPtr(a(1)), 20 Winsock1.SendData b End SubPrivate Sub Form_Load() Winsock1.Bind 1000 Winsock1.RemotePort = 2000 Winsock2.Bind 2000 Winsock2.RemotePort = 1000 End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long) Dim t As Variant Dim c() As Byte ReDim c(1 To bytesTotal) As Byte Winsock2.GetData c 'c = t Dim d(1 To 5) As Long CopyMemory ByVal VarPtr(d(1)), ByVal VarPtr(c(1)), bytesTotal For i = 1 To 5 Debug.Print d(i) Next End Sub
超级绿豆 1、昨天我按你说的做了是可以的 但为什么数组下限不能从1开始呢? 2、我把数组改成定长字符串为什么不行呢(我知道可以直接传字符串的 但我想用指针试试) Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long) Private Sub Command1_Click() Dim a(1 To 3) As String * 3 a(1) = "abc" a(2) = "d" a(3) = "efg" Dim b(0 To 8) As Byte CopyMemory ByVal VarPtr(b(0)), ByVal VarPtr(a(1)), 9 是不是用StrPtr??? Winsock1.SendData bEnd SubPrivate Sub Form_Load() Winsock1.Bind 1000 Winsock1.RemotePort = 2000 Winsock2.Bind 2000 Winsock2.RemotePort = 1000 Winsock1.RemoteHost = "127.0.0.1" Winsock2.RemoteHost = "127.0.0.1" End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long) MsgBox bytesTotal Dim c() As Byte ReDim c(0 To bytesTotal - 1) As Byte Winsock2.GetData c Dim d(1 To 3) As String * 3 CopyMemory ByVal VarPtr(d(1)), ByVal VarPtr(c(0)), bytesTotal For i = 1 To 3 Debug.Print d(i) '都是空格 Next End Sub 请老大指教 谢谢
接收端再copymemory到结构里.
Private Sub Command1_Click()
For i = 1 To 5
a(i) = 5
Next
Dim b() As Byte
ReDim b(1 To 20) As Byte
CopyMemory ByVal VarPtr(b(1)), ByVal VarPtr(a(1)), 20
Winsock1.SendData b
End SubPrivate Sub Form_Load()
Winsock1.Bind 1000
Winsock1.RemotePort = 2000
Winsock2.Bind 2000
Winsock2.RemotePort = 1000
End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim t As Variant
Dim c() As Byte
ReDim c(1 To bytesTotal) As Byte
Winsock2.GetData c
'c = t
Dim d(1 To 5) As Long
CopyMemory ByVal VarPtr(d(1)), ByVal VarPtr(c(1)), bytesTotal
For i = 1 To 5
Debug.Print d(i)
Next
End Sub
CopyMemory ByVal VarPtr(d(1)), ByVal VarPtr(c(1)), bytesTotal
改成
CopyMemory ByVal VarPtr(d(1)), ByVal VarPtr(c(0)), bytesTotal原因是
Winsock2.GetData c
之后会c重新定义为最小索引为0的数组,而不是你上面定义的从1开始
1、昨天我按你说的做了是可以的 但为什么数组下限不能从1开始呢?
2、我把数组改成定长字符串为什么不行呢(我知道可以直接传字符串的 但我想用指针试试)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)
Private Sub Command1_Click()
Dim a(1 To 3) As String * 3
a(1) = "abc"
a(2) = "d"
a(3) = "efg"
Dim b(0 To 8) As Byte
CopyMemory ByVal VarPtr(b(0)), ByVal VarPtr(a(1)), 9 是不是用StrPtr???
Winsock1.SendData bEnd SubPrivate Sub Form_Load()
Winsock1.Bind 1000
Winsock1.RemotePort = 2000
Winsock2.Bind 2000
Winsock2.RemotePort = 1000
Winsock1.RemoteHost = "127.0.0.1"
Winsock2.RemoteHost = "127.0.0.1"
End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
MsgBox bytesTotal
Dim c() As Byte
ReDim c(0 To bytesTotal - 1) As Byte
Winsock2.GetData c
Dim d(1 To 3) As String * 3
CopyMemory ByVal VarPtr(d(1)), ByVal VarPtr(c(0)), bytesTotal
For i = 1 To 3
Debug.Print d(i) '都是空格
Next
End Sub
请老大指教 谢谢