Question

J'essaie d'écrire un outil qui me permet d'inspecter l'état d'une application basée sur PowerBuilder. Je pense à quelque chose comme Spy ++ (ou encore plus agréable, "Snoop" tel qu'il existe pour les applications .NET) qui me permet d'inspecter l'arborescence des objets (et les propriétés des objets) de certaines interfaces graphiques basées sur PowerBuilder.

J'ai déjà fait la même chose pour les applications ordinaires (basées sur MFC) ainsi que pour les applications .NET, mais malheureusement, je n'ai jamais développé d'application dans PowerBuilder. Je pense donc généralement à deux problèmes à ce stade:

  1. Existe-t-il une API (de préférence en Java ou en C / C ++) permettant de parcourir les arbre d'objets visuels d'une application PowerBuilder? J'ai lu un peu sur le système d'interface native de PowerBuilder, mais il semble que cela ait pour but d'écrire des extensions PowerBuilder en C / C ++ qui puissent ensuite être appelées à partir du langage de script PowerBuilder, n'est-ce pas?

  2. Si une API est disponible - les applications PowerBuilder peuvent même exposer une sorte d'API compatible IPC qui me permet d'inspecter l'état d'une hiérarchie d'objets PowerBuilder sans être dans le processus de l'application PowerBuilder? Peut-être qu'une interface d'automatisation est disponible, ou quelque chose de basé sur COM, ou peut-être quelque chose d'autre?

À l'heure actuelle, j'ai l'impression qu'il est probablement nécessaire d'injecter une DLL dans le processus de l'application PowerBuilder, puis d'accéder à la machine virtuelle PowerBuilder en cours d'exécution afin de pouvoir l'interroger sur l'arborescence des objets. Une sorte de mécanisme IPC me permettra ensuite de transférer ces informations hors du processus de l'application PowerBuilder.

Quelqu'un en a-t-il déjà fait l'expérience ou peut-il nous éclairer sur le point de savoir si quelqu'un a déjà essayé de le faire?

Cordialement,

  • Frerich
Était-ce utile?

La solution

Premièrement, la réponse facile: je pense que ce que vous essayez de faire a été fait, en quelque sorte. Rex de Enable fait ce que je pense que vous recherchez, mais IIRC de parler avec les développeurs, cela dépend des crochets de code intégrés à l'application.

Ce qui conduit à la suggestion que je ne pense pas que vous serez capable de faire ce que je pense que vous essayez de faire complètement à l'extérieur de l'application. Vous pouvez récupérer des poignées de fenêtre avec des WinAPI et faire quelques opérations de base avec cela, mais pas autant que vous le souhaitez. Et obtenir des informations sur DataWindows avec WinAPI? Oublie.

Je crois que j'ai entendu parler d'une API similaire à celle dont vous parlez, mais je n'ai jamais entendu parler de quelqu'un d'autre que des fabricants de logiciels de test automatisé mettant la main dessus. Si cela est vrai (et que la qualité de cette information est dans le sens de "l'entendre dans le couloir"), je soupçonne qu'il pourrait y avoir des problèmes de sécurité des applications en laissant ces informations en sortir. (Je sais que vous ne voudriez jamais infecter mon application, ni fouiller pour découvrir mes secrets. un sourire )

Même avec des points d'ancrage dans l'espace mémoire de la machine virtuelle PowerBuilder, je ne suis pas conscient de la possibilité d'obtenir une liste d'objets en mémoire sans quelques points d'ancrage du framework PowerScript (par exemple, remplir une liste à chaque ouverture et chaque constructeur avec des descripteurs d'objet). Une fois que vous avez un handle de fenêtre, vous pouvez facilement parcourir ses tableaux de contrôles (et ses tableaux de contrôles de sous-classes) pour obtenir une liste d'objets sur la fenêtre, mais des manipulations telles que les descripteurs de variables d'instance NVO seraient problématiques.

J'admire l'idée. J'aimerais avoir de meilleures nouvelles (à part peut-être que Rex pourrait résoudre votre problème sans les maux de tête de le faire vous-même). Maintenant, je suis encore plus impatient de voir ce que Eran peut publier! sourire

Bonne chance,

Terry.

Autres conseils

Je viens de créer un tel outil, mais j'ai un peu triché. Était en train de poser moi-même la même question sur les groupes de discussion PB. Ma solution est composée de deux parties:

Outil similaire à un espion : application autonome qui, à l'instar de Spy ++, vous permet de faire glisser une cible sur un contrôle, à l'aide des fonctions de l'API Windows (bien que écrite en PB).

Infrastructure interne pour les applications cibles : situé à l'ancêtre de toutes les fenêtres de l'application. Une fois donné un certain handle (windows), il parcourt le tableau Control [] et recherche le contrôle dont le handle correspond à celui donné. Si nécessaire, il est également récurrent dans des conteneurs de contrôle, tels que des onglets.

Lorsque l'utilisateur sélectionne un contrôle, l'outil d'espionnage recherche d'abord la fenêtre qui le contient à l'aide de l'API Windows. Une fois trouvé, l'outil envoie un message personnalisé à cette fenêtre, qui est ensuite traitée par l'infrastructure de l'application. Le contrôle se trouve alors dans l’application PB et ses détails sont finalement renvoyés à l’outil espion, qui les présente à l’utilisateur.

Je soupçonne que la partie infrastructure peut être remplacée par un élément externe, car j’ai déjà vu des outils qui semblent pouvoir le faire (Visual Expert, QTP). Cependant, je n’ai pas eu le temps de poursuivre mes recherches et cette solution était relativement facile à développer.

Je dois dire que votre question arrive à un moment surprenant. Consultez cette question récente mienne . Si vous êtes intéressé par l'outil que j'ai créé, envoyez-moi un commentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top