scortek
Messages postés61Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention 1 août 2007
-
14 févr. 2007 à 16:30
scortek
Messages postés61Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention 1 août 2007
-
19 févr. 2007 à 09:25
J'ai des fonctions provenant d'une dll utilisant le port USB :
Public Declare Function SendByOsSw Lib "OsSwitch.dll" (pbyBuffer As Byte, ByVal iLength As Long, fCancel As Boolean) As Integer
Public Declare Function ReceiveByOsSw Lib "OsSwitch.dll" (ByVal pbyBuffer As String, ByVal iReadCount As Long) As Integer
Le soucis c'est que je n'arrive pas à paramétrer ces commandes correctement afin de pouvoir envoyer des chaînes de caractères d'abord puis de les recevoir.
Comment faire, sachant que je voudrais mettre les résultats reçu dans un tableau pour enregistrer un csv après ?
Voici un exemple de commande que je dois envoyé par SendByOsSw : "@EJL IQ ID<CR><LF>" et ce que je devrais recevoir par la commande Receive : "@EJL ANSWER = xxxxxxxx<CR><LF>.
Ce sont des commandes spécifiques pour une imprimante, mais cette dll pourrait être appliquée à d'autres prériphériques je pense.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 14 févr. 2007 à 21:00
Il semble s'agir là d'une dll appelée par un outil d'imprimante epson et je doute fort que le fabricant ait bien voulu "exposer" sa dll afin qu'elle puisse être utilisée à d'autres fins que celles qu'il a décidées et qui pourraient (mais sans aucune certitude, là... vraiment) n'être que celles de réagir différemment en fonction de l'OS d'utilisation...
Question à scortek : à quoi cherches-tu exactement une utilisation de cette dll, en fait ?
Si tu penses l'utiliser pour finalement n'établir, grâce à elle, qu'un contact électrique ailleurs, tu risques de perdre beaucoup de temps, à coût élévé (au moins en temps) avec un tel essai de "détournement" de fonctionnalité.
scortek
Messages postés61Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention 1 août 2007 15 févr. 2007 à 09:34
Effectivement, c'est une dll spécifique EPSON et je n'ai malheureusement aucune doc, je n'ai que des déclarations de fonctions pour m'aider :
Public Declare Function GetOsVersion Lib "OsSwitch.dll" () As Byte
Public Declare Function PortOpenByOsSw Lib "OsSwitch.dll" (ByVal nPort As Integer) As Integer
Public Declare Function SendByOsSw Lib "OsSwitch.dll" (pbyBuffer As Byte, ByVal iLength As Long, fCancel As Boolean) As Integer
Public Declare Function ReceiveByOsSw Lib "OsSwitch.dll" (ByVal pbyBuffer As String, ByVal iReadCount As Long) As Integer
Public Declare Function PortCloseByOsSw Lib "OsSwitch.dll" () As Long
Public Declare Function CheckDeviceIDByOsSw Lib "OsSwitch.dll" () As Integer
Public Declare Function GetModelNameByOsSw Lib "OsSwitch.dll" (ByVal pcModelName As String) As Integer
Public Declare Function GetIoErrorCodeByOsSw Lib "OsSwitch.dll" (ByVal iDetailError As Integer) As Integer
J'ai déjà à réussi à me débrouiller pour la fonction SendByOsSw (cf autre topic), ce que je n'arrive pas, c'est à utiliser la fonction ReceiveByOsSw pour récupérer dans un buffer ou autre les réponses aux commandes que j'envoie à l'imprimante.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 15 févr. 2007 à 10:41
pour la fonction Receive essaye peut-etre ce code. Je ne garantie pas le fonctionnement, je l'ai fait à partir de ce que l'on fait habituellement avec les api windows.
Il est probable que tu soit obligé de lire le buffer systématiquement après une commande devant te renvoyer une réponse. Probablement que tu ne pourras pas envoyer une suite de commandes demandant réponses, et ensuite venir lire l'ensembles des réponse obtenus, tu ne lira je pense que la réponse à la dernière commande.
Dim buffer As String
Dim retour As Integer
Dim nb As Long
buffer = String(255, 0) 'réservation mémoire pour le buffer de retour
nb = Len(buffer)
retour = ReceiveByOsSw(buffer, nb)
If retour <> 0 Then 'Vérifier la valeur de retour en cas de succès
'et d'erreur et ajuster le if en
conséquence
buffer = Left$(buffer, nb) 'Troncage du buffer sur le nombre de caractères effectivement
lus
MsgBox (buffer)
End If
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 15 févr. 2007 à 12:50
Etonnant qu'il y ait un retour Integer (16 bits) sur les fonctions.
iReadCount sera très certainement le nbr d'octets attendus en lecture dans le buffer (3eme param de CreateFile repassé en interne à DeviceIoControl sur le driver).
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 15 févr. 2007 à 13:24
Oui je pense que, comme pour beaucoup d'api windows, iReadConut doit réprésenté à l'appel de la fonction, le nb maxi de caractères lisibles (taille du buffer) et au retour de l'appel, le nombre de caractères effectivement lus (nombres de caractères significatifs dans le buffer).
Quant à la valeur de retour , il est effectivement assez étonant que ce soit un integer. Je pense que ça doit etre un code d'erreur et j'ai pensé même utilisable avec la fonction GetIOErrorCodeByOsSw. Mais quand on voit les parametres de cette dernière, il semblerait que non.
Perso, j'aurais bien tenter de faire quelques tests, bien que n'ayant pas d'Epson, mais il est impossible de trouver le pack de dll sur le net, car d'après les maigres infos glanées, cette dll ne fonctionne pas seule.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 févr. 2007 à 19:21
Si si, le pack existe (je suis tombé dessus par hasard hier soir, en cherchant...).
La Dll est distribuée avec un exe et d'autres outils.
Je chercherai à nouveau au retour du Resto...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 15 févr. 2007 à 19:49
La dll fait surement une enum matérielle pour vérif s'il y a bien le matos à gérer, peut-être même un simple CreateFile sur le driver (s'il y en a un).
scortek
Messages postés61Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention 1 août 2007 15 févr. 2007 à 22:47
Merci à tous pour vos réponses.
Mais malheureusement, cela se complique, la fonction ReceiveByOsSw fait planter Visual Studio et dans l'erreur, il fait appel appel à un module ou une dll applée PrnDrvXP
J'ai cette dll, mais je n'ai aucune doc pour pouvoir déclarer les fonctions.
Lorqu'une dll est appelé par une fonction, et qu'elle n'est pas déclarée, c'est normal que Visual Studio plante ?
Sinon jmfmarques et casy, où avez-vous trouver le pack sur le net (si vous pouvez mettre le lien, merci) ?
Petite précision sur le programme, c'est censé fonctionner sur les imprimantes Epson qui acceptent le langage propriétaire ESC/P ou EJL, autrement dit pas toutes les imprimantes...
Au lancement, du prog J'ai mis au point un algorithme de reconnaissance auto de l'imprimante lorqu'elle est connectée en utilisant GetModelNameByOsSw, PortOpenByOsSw, winspool.dll et kernel32.dll (donc ne passe pas par le driver de l'imprimante du tout).
Logiquement, je dois ouvrir le port (PortByOsSw), envoyer la commande EJL (SendByOsSw), recevoir l'accusé (ReceiveByOsSw), et fermer le port (PortCloseByOsSw) : mon raisonnement est-il bon ou dois-je fermer le port après l'envoi de la commande, puis réouverture (initialisation ?), puis fermeture.
Dans les 2 cas, ça fait planter Visual Studio.
scortek
Messages postés61Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention 1 août 2007 19 févr. 2007 à 09:25
Toujours pas beaucoup avancé malheureusement.
J'essaye par une autre méthode.
Si vous aves des idées, n'hésitez pas.
Quand est-il du lien sinon jfmarques ?
Merci