PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Pilotage emulateur 5250 (PCOM)
Pilotage emulateur 5250 (PCOM)
Débuté par Philippe, 20 juin 2017 15:39 - 11 réponses
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 :D
Sous Windev j'ai essayé sans succès ... :(
Quelqu'un aurait il une piste ?
Merci d'avance
Membre enregistré
945 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é
945 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 = "" // ici mettre le chemin de la DLL
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", ..............) // la il faut potasser la documentation de big blue

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
//info("DLL chargée")
END
// Tentative de connexion à la session "A" ouverte
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é
945 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é
945 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

//----- Vérifier si le fichier dll est bien présent
DllName = ComplèteRep(PathOfDll) + SansEspace(DllName)
IF NOT fFichierExiste(DllName) THEN
Erreur(ChaîneConstruit("%1 non trouvée !"), DllName)
RETOUR
END

//----- Chargement de la DLL
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

// See : https://www.ibm.com/support/knowledgecenter/en/SSEQ5Y_6.0.0/com.ibm.pcomm.doc/books/html/emulator_programming07.htm
// il y a un tableau pour la valeur de retour d'execution (retDLL)
// EHLAPI32.dll, ne contient qu'une seule fonction "hllapi" dont le prototype est : long hllapi (LPINT, LPSTR, LPINT, LPINT)
// LPINT est un pointeur sur un entier, LPSTR est un pointeur sur une chaine de caractère et long est en entier système
// 1° paramètre Function Number (input)
// 2° paramètre Data Buffer (input/output)
// 3° paramètre Buffer Length (input/output)
// 4° paramètre Position (input); Return Code (output)

//-----Connect Presentation Space (1) function
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
//----- L'exécution c'est bien passée
Info("Ok")
DéchargeDLL(hndDLL)
RETOUR
ELSE
//----- Erreur d’exécution
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 .. :D
Finalement après de multiples essais j'ai fini par obtenir le résultat que j'escomptais ... :merci:
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" // DLL Path
gsFunction est une chaîne = "HLLAPI" // Function Called
gnConnect est un entier = 1 // Connect
gnDisConnect est un entier = 2 // Disconnect
gnWrite est un entier = 3 // Write Host
gnRead est un entier = 8 // Read Host
gsPFK est une chaîne // Could be @E (Enter) @3 (PF3)
gnSetCursorPos est un entier = 40 // Set cursor position on PS
gnQueryCursorPos est un entier = 7 // Query cursor position on PS
gnReturnCode est un entier
gnLongueur est un entier


Code du bouton connexion: Appel une fonction "ConnectToSession"
//Connection au Host
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é
945 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é
945 messages
Popularité : +102 (110 votes)
Posté le 03 avril 2023 - 20:31
Bonjour

mon adresse pasquali.philippe(at)gmail.com