| |
Posté le 20 juin 2017 - 15:39 |
Bonjour, Je cherche désespérément à manipuler une fenêtre 5250 ou 3270 IBM Personal Communication (6.0) à partir de Windev21 pour automatiser des entrées répétitives. Précédemment je le faisais très facilement à partir d' ObjectRexx en utilisant les dll EHLLAPI ... mais ce soft date un peu et je dois un peu justifier l'achat de Windev21 Sous Windev j'ai essayé sans succès ... Quelqu'un aurait il une piste ? Merci d'avance |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 946 messages Popularité : +102 (110 votes) |
|
Posté le 20 juin 2017 - 17:56 |
Bonjour, Avec Windev vous pouvez faire des appels aux dll, donc pas de soucis de ce coté. J'ai eu à faire ce pilotage il y a déjà une quinzaine d'années et je n'ai malheureusement plus les sources de la collection de procédure. ( c'était du NT- avec Windev5.5 - et Client Access sur AS400) |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 946 messages Popularité : +102 (110 votes) |
|
Posté le 20 juin 2017 - 18:49 |
1° charger la dll EHLAPI32.DLL en mémoire (voir ChargeDLL) c'est très important de le faire et de mettre le chemin complet d'habitude je procède ainsi :
PathOfDll est une chaîne = "" DllName est une chaîne = ComplèteRep(PathOfDll) + "EHLAPI32.DLL" hndDLL est un entier = 0
IF NOT fFichierExiste(DllName) THEN Erreur(ChaîneConstruit("La dll : %1, n'est pas présente sur ce poste !", DllName)) RENVOYER False END
hndDLL = ChargeDLL(DllName) IF hndDLL = 0 THEN Erreur(ErreurInfo()) RENVOYER False END RENVOYER True
2° appeler la fonction avec les paramètres (voir AppelDll)
RetDll = AppelDLL32(DllName, "hllapi", ... Je crois qu'il n'y a qu'une seule fonction "hllapi", dont le premier paramètre est le code de la fonction à exécuter.
Attention 1° en général les chaines sont passées par adresse donc préfixer par & exemple : &SessionName 2° de bien vérifier les types des entiers en fonction du mode 32 ou 64 bits |
| |
| |
| | | |
|
| | |
| |
Posté le 21 juin 2017 - 14:50 |
Merci beaucoup Philippe, Le chargement de la dll via la commande "ChargeDLL" fonctionne bien apparemment. Mais c'est lors de l'appel à la fonction que ça plante. Mon bout de code:
PathOfDll est une chaîne = "C:\Program Files (x86)\IBM\Personal Communications" DllName est une chaîne = ComplèteRep(PathOfDll) + "EHLAPI32.dll" hndDLL est un entier = 0 RetDll est un entier
hndDLL = ChargeDLL(DllName) IF hndDLL = 0 THEN Erreur(ErreurInfo()) RENVOYER False SINON END
RetDll = AppelDLL32(DllName,"hllapi","1","&A") Info(RetDll)
J'ai beau changer les paramètres avec ou sans "&" j'ai systématiquement l'erreur suivante:
Erreur à la ligne 14 du traitement Clic sur BTN_Bouton1. Vous avez appelé la fonction AppelDLL32. La fonction 'hllapi' de la DLL 'C:\Program Files (x86)\IBM\Personal Communications\EHLAPI32.dll' a provoqué une erreur d'exécution.
----- Informations techniques -----
Projet : Test5250
Appel WL : Traitement de 'Clic sur BTN_Bouton1' (FEN_Test.BTN_Bouton1), ligne 14, thread 0 Fonction 'AppelDLL32', syntaxe 0
Que s'est-il passé ? La fonction 'hllapi' de la DLL 'C:\Program Files (x86)\IBM\Personal Communications\EHLAPI32.dll' a provoqué une erreur d'exécution.
Code erreur : 2805 Niveau : erreur fatale
Dump de l'erreur du module 'wd210vm.dll' (21.0.317.0). Identifiant des informations détaillées (.err) : 2805 Informations de débogage :
Details techniques :
Module : EHLAPI32.dll Adresse de base : 1C0E0000 Erreur systeme : Access violation (GPF) EIP = 1C0E2607 OS : Windows 7 Service Pack 1(6.1.7601) Registres :
EIP = 1C0E2607 EBP = 0018E4A8 EAX = 00000000 EBX = 0018E844 ECX = 00000031 EDX = EF82EF82 ESI = 0018E864 EDI = 00000000
Pile des appels :
[EHLAPI32.dll (1C0E0000)] 1C0E1050 : HLLAPI() + 5559 bytes [EHLAPI32.dll (1C0E0000)] 1C0E1050 : HLLAPI() + 29 bytes
Fonction (0,18) Informations supplémentaires : EIT_PILEWL : Clic sur BTN_Bouton1 (FEN_Test.BTN_Bouton1), ligne 14 EIT_DATEHEURE : 21/06/2017 14:39:49 EIT_TYPE_WDFILE : <2> EIT_IDCODE : <18>
Je me demande si la DLL est compatible avec Windev, car si je tente de la charger au travers de l'assistant "AppelDLL" j'obtiens un popup "Impossible de charger la DLL spécifiée" |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 946 messages Popularité : +102 (110 votes) |
|
Posté le 22 juin 2017 - 11:15 |
Bonjour quand vous devez passer une valeur de type chaine par adresse la méthode est la suivante 1° déclarez la variable : SessionName est une chaine = "A" On peut rajouter ASCIIZ sur 2 exemple : SessionName est une chaîne ASCIIZ sur 2 = "A" Dans ce cas SessionName ne peut contenir qu"un seul caractère windev ajoute automatiquement le 0x00
2° pour donner son adresse, préfixez par & RetDll = AppelDLL32(DllName,"hllapi","1", &SessionName)
Pour vous aidez + il faudrait me communiquer l'adresse de téléchargement de votre "Personal Communications" d'IBM |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 946 messages Popularité : +102 (110 votes) |
|
Posté le 22 juin 2017 - 14:40 |
Voici un bout de code qui devrait mieux fonctionner :
PathOfDll est une chaîne = "C:\Program Files (x86)\IBM\Personal Communications" DllName est une chaîne = "EHLAPI32.DLL" hndDLL est un entier retDll est un entier système
DllName = ComplèteRep(PathOfDll) + SansEspace(DllName) IF NOT fFichierExiste(DllName) THEN Erreur(ChaîneConstruit("%1 non trouvée !"), DllName) RETOUR END
WHEN EXCEPTION IN hndDLL = ChargeDLL(DllName) IF hndDLL = 0 THEN Erreur(ChaîneConstruit("Erreur de chargement de la dll : %1", DllName), ErreurInfo()) RETOUR END DO Erreur(ChaîneConstruit("Une erreur grave est survenue lors du chargement de la dll : %1", DllName)) RETOUR END
FunctionNumber est un entier système = 1 DataBuffer est une chaîne ANSI = "A" BufferLength est un entier système = Taille(DataBuffer) ReturnCode est un entier système = 0 WHEN EXCEPTION IN retDll = AppelDLL32(DllName, "hllapi", &FunctionNumber, &DataBuffer, &BufferLength, &ReturnCode) IF retDll = 0 THEN Info("Ok") DéchargeDLL(hndDLL) RETOUR ELSE Erreur(ChaîneConstruit("L'appel à la dll a retourné le code d'erreur: %1", retDll)) DéchargeDLL(hndDLL) RETOUR END DO Erreur("Erreur grave !") DéchargeDLL(hndDLL) RETOUR END
Sur mon poste cette fonction renvoi : 1 mais c'est peut être normal vu que le programme de test C:\Program Files (x86)\IBM\Personal Communications\Samples\vbpcsapi\vbpcsapi.exe donne le même résultat.
Pour la fonction Reset (code=21) j'ai bien en retour 0 =>ok Pour la fonction Pause (code=18) avec DataBuffer="" et BufferLength=5 (secondes) j'ai bien en retour 0 =>ok et une pause de 5s N 'ayant pas de connexion à un serveur je ne peut pas tester plus... |
| |
| |
| | | |
|
| | |
| |
Posté le 23 juin 2017 - 17:05 |
Encore Merci beaucoup Philippe pour tous tes efforts et tests pour m'aider ... Je débute en Windev et je n'ai pas toujours les bons réflexes ... ... probablement dû à mes expériences sur des langages ... disons ... plus anciens .. Finalement après de multiples essais j'ai fini par obtenir le résultat que j'escomptais ... A savoir ... être capable de communiquer avec une session 5250 à partir de Windev .. Je partage mon expérience si ça peut aider quelqu'un à l'avenir .... Mon interface:
Variables globales:
gsdllname est une chaîne = "C:\Program Files (x86)\IBM\Personal Communications\ehlapi32.DLL" gsFunction est une chaîne = "HLLAPI" gnConnect est un entier = 1 gnDisConnect est un entier = 2 gnWrite est un entier = 3 gnRead est un entier = 8 gsPFK est une chaîne gnSetCursorPos est un entier = 40 gnQueryCursorPos est un entier = 7 gnReturnCode est un entier gnLongueur est un entier
Code du bouton connexion: Appel une fonction "ConnectToSession"
gnLongueur = 1 sSession est une chaîne = COMBO_Connexion_à_la_session..ValeurAffichée gnReturnCode = ConnectToSession(sSession) Info (gnReturnCode)
Fonction "ConnectToSession"
Procedure ConnectToSession(sSession) gnLongueur = 1 gnReturnCode = AppelDLL32(gsdllname,gsFunction,&gnConnect,sSession,&gnLongueur,"NA") RENVOYER gnReturnCode
Pour les autres fonctions il suffit de suivre le "User guide" de Big Blue ... https://www.ibm.com/support/knowledgecenter/en/SSEQ5Y_6.0.0/com.ibm.pcomm.doc/books/html/emulator_programmingtfrm.htm
Voila ça a été laborieux entre les &, les déclarations de variable ... les 4 paramètres qu'il faut à tout prix passer à la fonction alors que ce n'était pas necessaire dans les autres langages ... mais c'est OK maintenant.
Merci encore Philippe pour tes encouragements car j'ai failli abandonner ... |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 946 messages Popularité : +102 (110 votes) |
|
Posté le 23 juin 2017 - 20:47 |
Bonjour ravi d'avoir pu vous aider. Juste une petite remarque. Créez une classe (cl5250 par exemple) cela vous évitera d'avoir des variables globales et si un jour vous avez besoin d'avoir cette fonctionnalité dans un autre programme ou de devoir gérer plusieurs sessions sur un seul pc se sera un jeu d'enfant. Certaines variable sont "en quelque sorte inutiles" mettez les en constante. |
| |
| |
| | | |
|
| | |
| |
Posté le 27 février 2018 - 11:59 |
Bonjour,
je travaille actuellement sur un projet similaire. En complément de vos informations, pouvez-vous svp m'indiquer comment je peux lire des informations (à des emplacements bien précis) et comment je peux écrire dans le simulateur (aussi à un emplacements précis) ?
Je vous souhaite une bonne journée et merci de votre aide. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 messages |
|
Posté le 04 juillet 2019 - 12:25 |
Merci à vous, cela m'a aidé aussi .... |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 message |
|
Posté le 03 avril 2023 - 17:20 |
Bonjour Philippe, Je travaille également sur un projet similaire et j'ai tenté de m'inspirer de votre code, mais je suis bloqué. Auriez vous la gentillesse de me contacter en MP pour m'aiguiller et me débloquer ? Merci beaucoup d'avance. Bien Cordialement. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 946 messages Popularité : +102 (110 votes) |
|
Posté le 03 avril 2023 - 20:31 |
Bonjour
mon adresse pasquali.philippe(at)gmail.com |
| |
| |
| | | |
|
| | |