Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 04-02-2015 21:04:09

toma  
Membre
Date d'inscription: 02-02-2015
Messages: 3
Pépites: 0
Banque: 34

[RESOLU] Accès aux données d'un DataWindow depuis une application externe

Salut,

dans le cadre de mon travail j'utilise une application (qui est centrale au point que sans elle je ne peux plus rien faire, d'où la prise de tête qui suit) mais qui est extrêêêmemeeeeeeennnnnt peu ergonomique.
L’application sert à faire le lien entre les employés qui sont sur le terrain et moi-même.
Son principal défaut est de balancer une popup bien crade (vol du focus, interruption dans le travail en cours...) en premier plan dès qu'un employé m'envoie un message.
Il est possible de désactiver l'apparition de cette popup mais il faut alors constamment consulter un onglet de l'application pour vérifier si on a un nouveau message.
Tous les messages qui ne sont pas marqués comme étant lus sont conservés et affichés dans une DataWindow qui se trouve dans l'onglet suscité.
J'ai donc pensé à coder un petit programme qui aille consulter les lignes présentes dans cette DataWindow et qui les affiche par le biais d'une popup non intrusive.

J'avais au départ naïvement pensé que cette DataWindow était une simple ListView (API WIN32) et j'ai donc commencé à coder une application qui détecte si le logiciel est lancé puis, va automatiquement passer en revue les éléments qui composent cette fenêtre jusqu'à trouver la DataWindow qui m'intéresse (récupération de handles en C à l'aide des API WIN32).

Le problème c'est qu'un fois que j'ai récupéré le handle de cette DataWindow, je ne peux rien en faire puisqu'il ne s'agit pas d'un objet standard.

Les contraintes auxquelles je suis soumis sont les suivantes :
- pas d'accès au code source du logiciel
- environnement de travail virtualisé sur lequel j'ai des droits limités

Ce que j'ai récupéré comme infos pour l'instant :
- Lorsque je récupère le handle de l’élément servant à afficher la liste des messages, si je consulte son nom de classe, le nom retourné est pbdw115. C'est ce qui m'a mis sur la piste de PowerBuilder, d'une DataWindow et qui m'indique également que l'application a été créée avec PowerBuilder 11.5 (n° également présent dans différentes dll).
- Il me sera impossible d'utiliser les API WIN32 pour récupérer le contenu de la DataWindow (en supposant que j'ai des talents incroyables en reverse engineering, je pourrais peut-être aller chercher les infos en RAM mais je ne dispose pas de ces talents).
- J'ai vu qu'un outil baptisé PBNI était mis à disposition des développeurs pour leur permettre d'accéder aux objets créés avec PowerBuilder depuis d'autres applications écrites en C++/Visual Basic...


PBNI me permettrait-il de communiquer avec l'application en question ou bien est-ce qu'il aurait fallut que cette application soit créée de façon spécifique dès le départ ?
Sur cette page, on peu lire :

The following diagram illustrates the two-way communication, with both PowerBuilder extensions and external applications, that PBNI provides for the PBVM. As the diagram shows, a PowerBuilder extension communicates with the PBVM through the IPB_Session interface, and the PBVM communicates with the extension through an interface derived from IPBX_UserObject.

Figure 1-1: Interaction between the PBVM and external applications and extensions
http://infocenter.sybase.com/archive/topic/com.sybase.dc37794_1100/html/pbnigref/pbni03.gif

Ce qu'ils nomment PowerBuilder extension, c'est un module développé sur mesure pour chaque application ou bien c'est l'application en elle même ? Parce qu'en passant un coup d'OllyDbg sur le programme, j'ai vu qu'il chargeait PBVM115.dll, donc que la VM de PowerBuilder devrait être disponible.

Est- qu'il s'agit là d'une piste que je peux caresser l'espoir d'approfondir ?


Merci d'avoir pris la peine de me lire jusqu'ici.
Merci d'avance pour vos réponses.

Si vous avez des questions à me poser sur des éléments que j'aurais oublié de fournir, n'hésitez pas à me les poser.


PS :
une page qui traite de l'utilisation de PBNI
Une page qui traite d'ojets OLE utilisables pour accéder aux éléments d'application crées avec PowerBuilder. Je ne trouve malheureusement pas d'autre info à ce sujet.

Dernière modification par toma (15-02-2015 08:55:31)

Hors ligne

 

#2 06-02-2015 12:42:51

Geo  
Membre completement Geek
Lieu: Binche
Date d'inscription: 15-12-2008
Messages: 119
Pépites: 378
Banque: 0

Re: [RESOLU] Accès aux données d'un DataWindow depuis une application externe

Derrière une datawindow (contrôl) se trouve une datawindow (object) qui contient le SELECT employé pour récupérer les données qu'elle affiche.
Imaginons que tu puisses récupérer ce SELECT, cela te serait-il utile ?
Tu pourrais exécuter ce même SELECT dans une petite application maison, pour faire ce que tu veux des résultats et t'éviter ainsi la mise en place de tout ça...


Rien ne sert de courir, il faut partir à point .

Hors ligne

 

#3 06-02-2015 13:03:48

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Accès aux données d'un DataWindow depuis une application externe

Tout le code d'une application PB est du bytecode interprété à l'exécution par une vm "boîte noire", à la manière du java. Cette VM est codée en Visual C++.

Il est possible depuis longtemps de déclarer une classe PB comme "externe", gérée dans une dll classique (langage indifférent c, delphi, ...) les interactions entre PB et la dll se limitent à appeler des fonctions de la dll et aux messages windows. La dll ne peut pas interagir autrement avec le PB, elle ne peut pas appeler de callback PB (cette notion n'existe pas en PB). On peut par exemple utiliser le contrôle d'édition de texte scintilla de cette manière dans PB.

Depuis la version 9 de PB, il est possible de coder des objets pour PB en C++ avec le framework PBNI. Ces extensions sont toujours des dll (avec un suffixe .pbx) qui implémentent une certaine interface
- PBX_CreateVisualObject ou PBX_CreateNonVisualObject,
- PBX_GetDescription
- PBX_GetVersion
que l'on peut appeler directement depuis le code PB ou utiliser dans l'éditeur de layout des fenêtres si c'est un objet visuel, et surtout à qui PB communique certaines informations importantes lors de l'instanciation comme le handle de la session PB permettant au code c++ d'accéder aux objets de la session (recherche d'un objet, accès aux différentes propriétés ou appel de méthodes PB).

J'ai développé plusieurs extensions PBNI non visuelles pour étendre le langage PB (regex, hashtable, ...) mais à chaque fois c'est PB qui appelle mon code.

à l'inverse, avec PBNI on peut aussi coder une appli qui est capable de démarrer une session PB. Mais xlat vient de me rafraîchir la mémoire en indiquant qu'une fois que PB démarre, tu n'as plus la main dans le code c++, sauf si ce même code propose des objets appelable par le PB.

Mais dans les 2 cas, sans avoir le code PB pour ajouter des appels à ce qui se trouve dans le PBNI ça risque d'être difficile de modifier le comportement de l'appli PB ou d'aller y piocher des infos.

Je me demande si il n'y a pas un autre approche : si cette fenêtre affiche une datawindow, il y a des chances pour que ce soient des données provenant d'une base, ce ne serait pas plus simple d'aller lire dans cette base ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#4 06-02-2015 14:21:23

Geo  
Membre completement Geek
Lieu: Binche
Date d'inscription: 15-12-2008
Messages: 119
Pépites: 378
Banque: 0

Re: [RESOLU] Accès aux données d'un DataWindow depuis une application externe

As-tu connaissance d'un fichier INI avec ton application ?
Trouves-tu un paramètre du type : DBMS = *** (DBMS = O10 Oracle10g (10.1.0) par exemple) ?
Si oui, ajoutes la chaine "TRACE" après le = (tu as alors DBMS = TRACE O10 Oracle10g (10.1.0) par exemple) et lance ton appli.
Il te proposera un écran pour sauvegarder un fichier le LOG (fichier texte) dans lequel tu retrouveras ton SELECT. Le plus difficile sera peut-être de l'identifier parmi les autres...
Une fois retrouvé, tu en fais ce que tu veux .


Rien ne sert de courir, il faut partir à point .

Hors ligne

 

#5 15-02-2015 08:55:12

toma  
Membre
Date d'inscription: 02-02-2015
Messages: 3
Pépites: 0
Banque: 34

Re: [RESOLU] Accès aux données d'un DataWindow depuis une application externe

Merci pour vos réponses, je suis désolé de ne pas avoir répondu plus tôt mais j'étais absorbé par le développement de ma petite application.

Comme je vous l'avais dit, tout tourne sur un système virtualisé sur lequel je n'ai que des droits restreints donc impossible pour moi d'approfondir les pistes que vous m'aviez fournit.
Plutôt que de chercher à accéder aux données de la DataWindow, j'ai donc choisi de modifier le comportement de la fenêtre popup.
J'ai injecté une DLL faite maison dans le processus souhaité pour pouvoir sous-classer cette immonde popup et la transformer en une vraie popup qui se fait discrète s'il n'y a pas de nouveaux messages, qui attire l'oeil de l'utilisateur quand il y a de nouveaux message (si le logiciel a cherché à afficher cette fenêtre c'est qu'il y a un nouveau message) et qui, surtout, ne vole pas la focus à tout bout de champ.

Merci encore à vous et peut-être à une prochaine.

Dernière modification par toma (15-02-2015 08:57:23)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22