OVH Cloud OVH Cloud

Winsock SendData pour un array

4 réponses
Avatar
jose MULLER
Bonjour
Je coince pour l instant sur la lecture d un array de 20 bytes ( en fait 5
mots de 4 bytes)
comme me le Vincent Guichard proposait.


Public Type TestBytes
m_0(1 To 20) As Byte
End Type
Public tbStatus as testBytes


1)
' le code suivant fonctionne mais trop d'appel a faire pour extraire
tout le contenu de la structure
' et il est connu qu il y a bug dans Win95/98 ( bug réparé dans XP et 2000)
mais je tourne sous Win98

' Me.Winsock1.GetData ServerStatus.m_ErrorCode, vbLong, 4

2)
' le code suivant ne fonctionne pas , rien que des zéros
Me.Winsock1.GetData tbStatus.m_0, vbArray + vbByte, 20 ' lecture
en array de 20 bytes
For i = 1 To 20
Memo.Text = Memo.Text & i & vbTab & Hex(tbStatus.m_0(i)) & vbCrLf
Next i
LSet ServerStatus = tbStatus ' passage de l array
vers la structure


j'ai aussi l'erreur de compilation suivante sur le ligne
Me.winsockk1.getdata...........
:
'Only user-defined type defined in public object modules can be coerced to
or from a variant........'



Une idée,........ merci
José MULLER

4 réponses

Avatar
Zoury
Salut Jose! :O)

as-tu essayé ma solution?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zoury
> ensuite, il faut une boucle pour coller ca dans ta structure tbStatus
for i = 0 to 19
tbStatus.m0(i)=tabl(i)
next i
suivit du LSet



Pourquoi utiliser LSet si tu as déjà copié les éléments un à un?
Personnellement je trouve la méthode du CopyMemory beaucoup plus directe,
flexible et lisible...

J'ai fait un projet de test que je met en PJ. (Ca passe au moin les pj?)



Yep.. seulement lorsque tu postes avec pièce jointe, ton message n'est pas
archivé dans Google, ce qui rend souvent les archives incomplète. Alors le
mieux est de posté une réponse et de posté le projet en réponse à cette
réponse. ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Vincent Guichard
Zoury a écrit :
ensuite, il faut une boucle pour coller ca dans ta structure tbStatus
for i = 0 to 19
tbStatus.m0(i)=tabl(i)
next i
suivit du LSet




Pourquoi utiliser LSet si tu as déjà copié les éléments un à un?


Pour assurer la conversion byte() -> long

Personnellement je trouve la méthode du CopyMemory beaucoup plus directe,
flexible et lisible...


Possible, oui. En fait, quand j'ai proposé ma solution, il ne m'était
pas venu à l'idée que GetData n'acceptait que les tableaux dynamiques en
sortie.

J'ai fait un projet de test que je met en PJ. (Ca passe au moin les pj?)



Yep.. seulement lorsque tu postes avec pièce jointe, ton message n'est pas
archivé dans Google, ce qui rend souvent les archives incomplète. Alors le
mieux est de posté une réponse et de posté le projet en réponse à cette
réponse. ;O)



OK, je retiens le conseil.

Vincent Guichard
Avatar
jose MULLER
merci a tous cela fonctionne.


j'ai retrouvé une reponse de microsoft dans le HOWTO

ID: Q152058 Send and receive UDT's Using the Winsock control

Voici la partie de code


'-------------------------------------------------------
Public Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory"
(hpvDest As Any, hpvSource As Any, ByVal cbcopy As Long)

'-------------------------------------------------------
Public Type TCServerStatus
m_ErrorCode As Long
m_Info1 As Long
m_Info2 As Long
m_Status As Long
m_Length As Long
End Type

Public ServerStatus As TCServerStatus
'---
Public Type TCUserSetupData
m_LowThreshold As Long 'Single
m_HighThreshold As Long 'Single
m_LowLowThreshold As Long 'Single
m_HighHighThreshold As Long 'Single
m_MinDefectArea As Long 'Single
End Type
Public UserSetupData As TCUserSetupData

' structure UserSetupdata en format byte
Public Type TestBytesUser
m_0(1 To 20) As Byte
End Type

Public tbU As TestBytesUser


Private Sub cmd_PRTC_INIT_HARDWARE_Click()
'----------------------------------------
'
Memo.Text = Memo.Text & "cmd_PRTC_INIT_HARDWARE" & vbCrLf


'1 envoi de la commande
Me.Winsock1.SendData CByte(PRTC_INIT_HARDWARE)

'2 envoi de la structure contenant les thresholds
' UserSetupData.m_LowThreshold = &H1020304
' UserSetupData.m_HighThreshold = &H0
' UserSetupData.m_LowLowThreshold = &H0
' UserSetupData.m_HighHighThreshold = &H0
' UserSetupData.m_MinDefectArea = &H1020304

LSet tbU = UserSetupData ' on profite que tbU a aussi 20 bytes

Me.Winsock1.SendData tbU.m_0

'3 le status en retour via Winsock1_DataArrival(20 bytes)

Memo.Text = Memo.Text & "cmd_PRTC_INIT_HARDWARE End" & vbCrLf

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'---------------------------------------------------------
Dim i As Integer
Dim bt() As Byte
Dim vta

Memo.Text = Memo.Text & "Winsock1_DataArrival : " & bytesTotal & vbCrLf

Select Case bytesTotal


Case 20 ' le ServerStatus en retour

Me.Winsock1.GetData vta, vbArray + vbByte, LenB(ServerStatus) ' lecture
en array de bytes
bt = vta
CopyMemory ServerStatus, bt(0), LenB(ServerStatus)

Memo.Text = Memo.Text & "ServerStatus.m_ErrorCode : " &
Hex(ServerStatus.m_ErrorCode) & vbCrLf
Memo.Text = Memo.Text & "ServerStatus.m_Info1 : " &
Hex(ServerStatus.m_Info1) & vbCrLf
Memo.Text = Memo.Text & "ServerStatus.m_Info2 : " &
Hex(ServerStatus.m_Info2) & vbCrLf
Memo.Text = Memo.Text & "ServerStatus.m_Status : " &
Hex(ServerStatus.m_Status) & vbCrLf
Memo.Text = Memo.Text & "ServerStatus.m_Length : " &
Hex(ServerStatus.m_Length) & vbCrLf


Case 88 ' le ServerSetup en retour
Me.Winsock1.GetData vta, vbArray + vbByte, LenB(ServerSetupData) '
lecture en array de bytes
bt = vta
CopyMemory ServerSetupData, bt(0), LenB(ServerSetupData)

Memo.Text = Memo.Text & "ServerSetupData.m_PixelFreq : " &
Hex(ServerSetupData.m_PixelFreq) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bDoubleClock : " &
Hex(ServerSetupData.m_bDoubleClock) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bPosSlope : " &
Hex(ServerSetupData.m_bPosSlope) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_Delay : " &
Hex(ServerSetupData.m_Delay) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_LineFreq : " &
Hex(ServerSetupData.m_LineFreq) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_StartLength : " &
Hex(ServerSetupData.m_StartLength) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bExternalStart : " &
Hex(ServerSetupData.m_bExternalStart) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_ExternalStartDivider: " &
Hex(ServerSetupData.m_ExternalStartDivider) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_AuxOut : " &
Hex(ServerSetupData.m_AuxOut) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_CalibSize : " &
Hex(ServerSetupData.m_CalibSize) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_WhiteLevel : " &
Hex(ServerSetupData.m_WhiteLevel) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bRecoverFromError : " &
Hex(ServerSetupData.m_bRecoverFromError) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bAutoCalib : " &
Hex(ServerSetupData.m_bAutoCalib) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_AutoCalLineNbr : " &
Hex(ServerSetupData.m_AutoCalLineNbr) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_AutoCalLineFreq : " &
Hex(ServerSetupData.m_AutoCalLineFreq) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bStoreVideoData : " &
Hex(ServerSetupData.m_bStoreVideoData) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_bSaveLogFile : " &
Hex(ServerSetupData.m_bSaveLogFile) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData. m_XSize: " &
Hex(ServerSetupData.m_XSize) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_FirstPixel: " &
Hex(ServerSetupData.m_FirstPixel) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_LastPixel : " &
Hex(ServerSetupData.m_LastPixel) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_CenterPosition: " &
Hex(ServerSetupData.m_CenterPosition) & vbCrLf
Memo.Text = Memo.Text & "ServerSetupData.m_PixelSize : " &
Hex(ServerSetupData.m_PixelSize) & vbCrLf

End Select

Memo.Text = Memo.Text & "---------" & vbCrLf

End Sub

Private Sub cmdClient_Click()
'------------------------

Me.Winsock1.RemoteHost = "127.0.0.1"
Me.Winsock1.RemotePort = 3000
Me.Winsock1.Protocol = sckTCPProtocol
Me.Winsock1.LocalPort = 0

Me.Winsock1.Connect

Memo.Text = Memo.Text & "cmdClient" & vbCrLf

End Sub