Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
je désirerai manipuler dans mon application principal un programme de gestion de webcam, développé lui aussi en Powerbuilder.
Le souci est que j'aimerai avoir le schéma suivant :
1) A appelle B et attend
2) B manipule la webcam, et enregistre une image dans un répertoire défini. Bonus, B retourne le chemin d'accès à l'image.
3) A reconnait que B a fini son traitement et reprend la main.
Et là je suis perdu. La méthode run ne semble pas gérer le lien de parenté ?
A est en powerbuilder 7.0.3 et B en powerbuilder 9.0.2.
Merci de vos réponses !
Dernière modification par sbouvetJD (17-09-2007 13:02:51)
Hors ligne
Bon j'ai trouvé ce petit bout de code, je vous tiens au courant si ça marche :
OleObject wsh integer li_rc CONSTANT integer MAXIMIZED = 3 CONSTANT integer MINIMIZED = 2 CONSTANT integer NORMAL = 1 CONSTANT boolean WAIT = TRUE CONSTANT boolean NOWAIT = FALSE wsh = CREATE OleObject li_rc = wsh.ConnectToNewObject( "WScript.Shell" ) li_rc = wsh.Run("Notepad" , NORMAL, WAIT) messagebox("hello", "world")
Hors ligne
pour l'info!
Hors ligne
Ça marche dis tu... y compris le bonus du point 2) ?
Si oui, Peux-tu publier le code qui te permet de récupérer le chemin d'accès ? Ça s'apparente furieusement à un appel de fonction "callback", je croyais la chose à peu près impossible avec PowerBuilder !
Hors ligne
La méthode run lance un traitement puis reprends l'éxécution du programme directement , sans attendre de retour du traitement lancé.
Hors ligne
Alors non, effectivement, je n'ai pas encore trouvé comment récupérer une valeur de retour, mais je laisse mes collègues se pencher sur le problème aussi, je ne vais pas leur mâcher le travail non plus
Hors ligne
Pourquoi ne pas utiliser les objets des pbl de l'appli existante ?
Hors ligne
Juste une question, une fois qu'il est lancé, et t'il possible de lui donner l'ordre d'arreter ? ou de fermer l'application ?
Hors ligne
A la question de JCZ : nous nous confrontions à un problème lié à l'environnement CITRIX : application hébergée sur le serveur et webcam en local, d'où problème de communication...
A la question de Melke : je ne pense pas, mais en même temps je n'ai pas essayé ;)
C'est ici que j'ai trouvé le petit bout de code qui va bien.
Hors ligne
J'ai trouvé le petit bout de code
Dans Local external functions :
FUNCTION boolean PostMessageA(ulong hwndle,UINT wmsg,ulong wParam,ulong lParam) & LIBRARY "user32.dll"
Dans le code :
CONSTANT uint WM_CLOSE = 16 CONSTANT uint WM_QUIT = 18 String ls_commande, lpWindowName, lpClassName[], ls_null ulong lul_whnd setnull(ls_null) n_cst_platform lnv_platform f_setplatform(lnv_platform,true) lpWindowName = "Calculatrice" lpClassName[1] = ls_null lnv_platform.of_setfindwindowclasses( lpClassName) // lul_whnd : handle de la fenêtre, si plusieurs fenêtre ouvert du même nom, il prends le dernier ouvert lul_whnd = lnv_platform.of_findwindow(lpWindowName) IF lul_whnd > 0 THEN // Au choix PostMessageA(lul_whnd, WM_CLOSE, 0, 0); PostMessageA(lul_whnd, WM_QUIT, 0, 0); ELSE MessageBox("Oups", ls_app + " is not running!") END IF
Si quelqu'un sait comment trouvé le handle de la fenêtre plus facilement, je suis preneur...
j'ai trouvé sur un site Coréen/Chinois (raillez la mention inutile) : ici
Dernière modification par Melke (11-09-2007 14:38:37)
Hors ligne
J'ai une erreur sur la station CITRIX : "Error calling external object function run" ; comme s'il n'arrivait pas à utiliser l'objet WScript.Shell ?
Je précise que ça marche en configuration C/S classique.
Complément :
wsh = CREATE OleObject li_rc = wsh.ConnectToNewObject( "WScript.Shell" ) li_rc = wsh.Run("C:\webcam\webcam.exe" , NORMAL, WAIT)
Le disque C:\ est le disque de la station ; le disque système du serveur est nommé S:\ donc normalement, il ne devrait pas y avoir de problème pour reconnaître le path ?
Dernière modification par sbouvetJD (14-09-2007 09:09:13)
Hors ligne
Quelqu'un aurait-il déjà manipulé les objets MetaFrameCOM.MetaFrameSession, MetaFrameCOM.MetaFrameServer, etc. ?
Hors ligne
wsh.Exec("C:\webcam\webcam.exe" , NORMAL, WAIT)
ca marche pas comme ca ?
Hors ligne
Et non, Exec n'aime pas non plus. En fait, on a essayé en mettant le webcam.exe dans le répertoire Winnt du serveur et en modifiant l'appel comme suit :
wsh.Exec("webcam.exe" , NORMAL, WAIT)
et là ça marchait. Mais l'exécutable sur le serveur ne pouvait discuter avec la webcam du poste client... ; enfin là j'essaie de récupérer le nom du poste client (via MetaFrameCOM.MetaFrameSession), mais c'est pô gagné...
Hors ligne
ce n'est pas lié avec un probleme de licence pb ? des fois...
Hors ligne
en tentant cela ?
wsh = CREATE OleObject li_rc = wsh.ConnectToNewObject( "WScript.Shell" ) li_rc = wsh.Run("~"C:\webcam\webcam.exe~"" , NORMAL, WAIT)
Hors ligne
Qu'enteds-tu par "licence pb" ? On paie nos impôts nous môssieu C'est du PB7 tout ce qu'il y a de plus légal. (ça au moins)
Hors ligne
licence par pb professionnel , pb enterprise, ou autres...
Hors ligne
bon courage à toi, et donnes nous des news sur tes recherches...
d'autres personnes pourraient rencontrer le meme probleme.
A+++
Hors ligne
Voici le code implémenté, utilisant l'API WFAPI.dll. Je crée un User Object UO_WFAPI
Long ll_retour, ll_recherche, ll_server, ll_buffer Long i, ll_SessionId String ls_retour Choose Case as_recherche Case "username" ll_recherche = C_USERNAME /* 5 */ Case "clientname" ll_recherche = C_CLIENTNAME /* 10 */ Case "winstationname" ll_recherche = C_WINSTATIONNAME /* 6 */ End Choose ll_SessionId = -1 /* SESSION EN COURS */ ll_server = WFOpenServerA(gComputerName) /* HANDLE DU SERVEUR */ If WFQuerySessionInformationW(ll_server, ll_SessionId, ll_recherche, ll_buffer, ll_retour) Then If ll_retour > 0 Then /* PARCOURS DU BUFFER RETOUR POUR RECONSTRUIRE */ For i = 1 to ll_retour /* LA VALEUR */ ls_retour += String(ll_buffer, "address") ll_buffer ++ Next End If End If WFFreeMemory(ll_buffer) /* LIBERATION DU BUFFER */ WFCloseServer(ll_server) /* DESALLOCATION DU HANDLE SERVEUR */ Return ls_retour
Ensuite, j'ai créé un partage sur le poste local sur le dossier contenant l'exécutable, et je l'appelle assez simplement :
UO_WFApi uo_citrix uo_citrix = Create UO_WFApi ls_ClientName = uo_citrix.uf_getinfosession("clientname") lole_appli = CREATE OleObject li_ret = lole_appli.ConnectToNewObject("WScript.Shell") li_ret = lole_appli.Run("\\" + ls_clientname + "\WEBCAM\webcam.exe", C_NORMAL, C_WAIT)
Le problème reste entier car l'exécutable appelé sur le poste client est monté en mémoire sur le serveur et n'arrive donc pas à communiquer avec la webcam distante...
Hors ligne
La solution viendrait avec l'utilitaire psexec (en tous cas c'est ce que me dit mon chef) ; on a juste un problème de droit, l'utilisateur doit être administrateur du poste.
uo_citrix = Create UO_WFApi ls_ClientName = uo_citrix.uf_getinfosession("clientname") lole_appli = CREATE OleObject li_ret = lole_appli.ConnectToNewObject("WScript.Shell") li_ret = lole_appli.Run("psexec \\" + ls_clientname + " -i C:\webcam\webcam.exe", C_NORMAL, C_WAIT)
Et ça marche !
Hors ligne
merci à toi, et à ton chef... je lui paierai un hamburger si je le croise...
Hors ligne