Page 1 sur 1

[RESOLU] dll, chaine de caractères et pointeurs

Publié : mar. 23/oct./2012 7:07
par fd
Bonjour,
Je cherche à récupérer les codes barres d'un scanner portable. La dll est fournie. Pour la partie numérique (nombre de codes par exemple) pas de problème, mais comment récupérer les caractères ?
Je vous mets un bout de code pour exemple :

Code : Tout sélectionner

Enumeration
  #Bibliotheque
EndEnumeration

Global STATUS_OK.l = 0

Prototype.l appel_fonction ()

If OpenLibrary(#Bibliotheque, "Csp2.DLL")
  Ok = 0 
  For f = 0 To 15
    Com = f
    If  CallFunction(#Bibliotheque, "csp2Init",f) = 0
      nbData.l = CallFunction(#Bibliotheque, "csp2ReadData")
      If nbData >= 0
        Ok = 1
        Break
      EndIf
    EndIf
  Next
  If Ok = 0
    Debug "Scanner non reconnu"
  Else 
    Debug "Scanner sur COM"+Str(Com+1)+" / Codes lus "+Str(NbData)
    If CallFunction(#Bibliotheque, "csp2GetASCIIMode") 
      Debug "ASCII"
    Else
      Debug "Binary"
    EndIf
    If GetFunction(#Bibliotheque, "csp2GetDllVersion")
      Debug "Oui"
    Else
      Debug "Non"
    EndIf
  EndIf  
  CallFunction(#Bibliotheque, "Csp2Restore")
  CloseLibrary(0)
Else
  MessageRequester("STOP","Erreur ouverture librairie")
EndIf
A la place du debug oui /non, je veux mettre peeks(callfunction(#Bibliotheque, "csp2GetDllVersion")). Mais cela génère une erreur acces mémoire invalid, alors que le oui du debug est retourné.
Voici la fonction dans la dll : Declare Function csp2GetDllVersion Lib "csp2.dll" (ByVal szDllVersion As String, ByVal nMaxLength As Long) As Long
Il y a le même problème pour la récupération des données, je crois comprendre qu'il faut mettre en paramètre une adresse qui récupère le résultat ? Pouvez vous m'aider.
Je vous remercie.

Re: dll, tableaux et pointeurs

Publié : dim. 11/nov./2012 15:20
par fd
Bonjour,

Je progresse un peu, mais je cherche toujours de l'aide sur le passage des tableaux.

Voici le principe (en tout cas ce que j'en ai compris) :

1/ Lorsque la dll renvoie uniquement un nombre :
nbData.l = CallFunction(#Bibliotheque, "csp2ReadData") ; cela fonctionne

2/ Lorsque la dll renvoie une chaine de caractères :
Version.s = ""
CallFunction(#Bibliotheque, "csp2GetDllVersion",@Version,16)
Debug Version ; cela fonctionne aussi

3/ Lorque la dll renvoie un tableau, cela ne fonctionne pas :

Dim tabTime.b(5)
If CallFunction(#Bibliotheque, "csp2GetTime",@tabTime) = STATUS_OK
Debug tabTime
Debug tabTime(0)
Debug tabTime(1)
Debug tabTime(2)
Debug tabTime(3)
Debug tabTime(4)
Debug tabTime(5)

Le premier tabTime contient une valeur, mais je ne sais pas ce qu'elle représente les tabTime(0 à n) contiennent 0.

Je vous mets l'équivalent en vb :
Private Sub GetTime_Click()
Dim arrbyteRawTime(5) As Byte
Dim dwRC As Long
dwRC = csp2GetTime(arrbyteRawTime(0))
WriteToLog "CS1504 Get Time: " & vbCrLf & CStr(arrbyteRawTime(4)) & "/" & _
CStr(arrbyteRawTime(3)) & "/" & CStr(arrbyteRawTime(5) + 2000) & " " _
& CStr(arrbyteRawTime(2)) & ":" & CStr(arrbyteRawTime(1)) & ":" & _
CStr(arrbyteRawTime(0))
End Sub

Je vous remercie de votre aide.

Re: dll, chaine de caractères et pointeurs

Publié : dim. 11/nov./2012 23:30
par graph100
sans le matos, et la dll pour tester, c'est pas évident.

Cependant, pour ça :

Code : Tout sélectionner

Dim tabTime.b(5)
If CallFunction(#Bibliotheque, "csp2GetTime",@tabTime) = STATUS_OK
Debug tabTime
tabTime te donne l'adresse de la variable tabTime

tu confonds les tableaux, variables et les adresses ;)

Re: dll, chaine de caractères et pointeurs

Publié : lun. 12/nov./2012 4:58
par graph100
je ne sais pas vraiment ce qu'attend la fonction de la DLL, mais si tu veux lui passer l'adresse du tableau,

il faut faire ça :

Code : Tout sélectionner

Dim tabTime.b(5)
If CallFunction(#Bibliotheque, "csp2GetTime",@tabTime()) = STATUS_OK
Debug tabTime()
@tabtime est l'adresse de la variable "tabtime"
@tabtime() est l'adresse du tableau "tabtime()"

Donc à mon avis, faudrait que tu testes avec cette correction, et si ça ne fonctionne pas, regardes si ça marcherais avec un buffer. Du genre :

Code : Tout sélectionner

*tabTime.i = AllocateMemory(6 * SizeOf(Byte))

If CallFunction(#Bibliotheque, "csp2GetTime",*tabTime) = STATUS_OK
	For index = 0 To 5
		Debug PeekB(*tabTime + index * SizeOf(Byte))
	Next
Moi je peux pas aller plus loin. :roll:

Re: dll, chaine de caractères et pointeurs

Publié : lun. 12/nov./2012 7:17
par fd
Super, la dernière solution fonctionne. Merci beaucoup, je vais pouvoir continuer.

Re: [RESOLU] dll, chaine de caractères et pointeurs

Publié : lun. 12/nov./2012 21:09
par graph100
ça c'est cool ! :mrgreen: