API 32 - Clonage par Hook

cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
- 2 juin 2011 à 14:16
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
- 2 juin 2011 à 20:59
Salut ta tou(te)s

Pour une fois, c'est moi qui ait un problème.
Une application externe utilise un OCX (apparemment créée en C).
Cet OCX est une zone saisie d'expression.
Esthétiquement, elle ressemble beaucoup à une RichTextBox ornée d'une colonne avec les numéros de ligne sur la gauche.
Le but est de récupérer le texte qui se trouve à l'intérieur afin de redimensionner la forme qui la supporte et être sûr que le texte est affiché en intégralité - marre de faire des resizes 500 fois par jour.

J'ai donc fait une recherche des Handles de la fenêtre, puis trouvé le handle de la zone de saisie en question.
Sa classe a le nom biscornu de Afx:02CA0000:8b:00010013:00000000:00000000 et ne possède pas d'enfant.
Tous les autres objets de la forme (boutons, labels, listes) ont des classes cohérentes/classiques (button, static ...).

Le problème est que ce handle ne retourne rien aux appels de SendMessage en EM_GETLINECOUNT, EM_GETLINE, WM_GETTEXTLENGTH ou WM_GETTEXT.

J'ai inclus cet OCX dans un projet VB6 et, dans l'explorateur d'objet, je vois qu'elle possède des méthodes intéressantes comme Text, LineLength, GetTextLength, GetWindowText (ces noms ressemblent à des APIs mais il s'agit bien de méthodes de l'objet)

Mon idée serait donc d'implanter une instance de cet OCX sur une forme, puis de "faire une copie" de l'objet externe dans cette instance (par le lien du handle) afin de pouvoir récupérer les infos calmement.

Côté Hook, est-il possible de cloner un objet dont on connait le handle vers une instance de même structure ?
Cerise sur le gâteau : l'instance VB6 de cet OCX ne possède pas de propriété .hWnd - faudra que j'en fasse la recherche.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

7 réponses

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
2 juin 2011 à 15:00
Bonjour, Jack,

Cette affaire me parait bien complexe à ce stade.
Je suis donc pour l'instant autant que toi, sinon plus, dans le brouillard.
Mon tout premier réflexe, toutefois, serait de tenter de déterminer les dépendances éventuelles de cet OCX. Ce que tu dis au sujet de ce que te montre l'explorateur d'objet me donne par exemple à penser que certaines fonctions de l'Api de Windows sont peut-être véritablement utilisées.
J'utiliserais alors un outil comme Dependancy Walker pour en avoir le coeur net.
Peux-tu faire ce geste et nous en communiquer les résultats ?

PS : premier geste ne veut bien évidemment pas dire garantie, ensuite, d'u_ne solution, hein
Amitiés.
Jacques



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
2 juin 2011 à 15:44
Salut ucfoutu

Tu penses bien que toute ma collection de "spy" y est passée : Dependancy Walker dont tu parlais, Spy++, WinDist, WinId, ShoWin, MiniSpy ...
Mais bon, à part te dire que ces programmes appellent les fonctions récurrentes du Kernel32 ou User32, je n'ai pas réussi à en tirer plus d'info.
Surtout que les infos affichées concernent tout l'objet, et la partie qui m'intéresse n'est qu'un enfant qu'il n'a pas été possible d'isoler (ch'te mettrais des beignes à ces ch'tites n'enfants, moi; saleté de z'enfants
).

Merci pour les idées, c'est toujours constructif.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
2 juin 2011 à 17:42
Mais s'il a ajouté des fonctions publiques dans un module .bas, elles sont également montrées par l'explorateur d'objet.

Peu importe.
Je viens de me casser les dents avec de nombreuses tentatives diverses, sans parvenir à "cloner" (j'ai tenté de cloner un ocx autre, que j'ai placé sur un Form).

Je comprends par ailleurs mal ce mécanisme :
Mon idée serait donc d'implanter une instance de cet OCX sur une forme, puis de "faire une copie" de l'objet externe dans cette instance (par le lien du handle) afin de pouvoir récupérer les infos calmement.

Peux-tu développer cette pensée, au besoin avec un petit schéma succinct ou, au moins, un exposé détaillé, ou encore un exemple fictif ?

PS : les constantes utilisées par SendMessage peuvent, pour le même "type" de contrôle, différer d'un contrôle à l'autre. Je prends par exemple l'exemple (redondance !) d'un contrôle listbox de VB6 et d'un contrôle listbox de VBA. Les constantes qui marchent pour celui de VB6 ne marchent pas pour celui de VBA (j'ai cherché pendant des mois les valeurs à utiliser pour ces constantes pour VBA ... forcément par tâtonnement ... en vain).

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
2 juin 2011 à 17:46
Re...
Et si tu t'amusais à faire un ocx qui utiliserait cet ocx ? (cet_ocx comme objet dans ton_ocx).
Mais je ne sais pas si cela t'apporterait réellement plus de confort ou de facilité d'observation
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
2 juin 2011 à 18:34
Ce que j'ai voulu dire :
L'OCX est compatible avec VB6.
Je l'ai chargé et implanté sur une forme sans problème (zône de texte avec numérotation de ligne).
Je peux y entrer du texte, le relire, comme un OCX classique.
Je pars du principe que l'OCX que j'utilise ainsi est le même que celui utilisé par le programme externe.
L'idée, donc, serait de trouver un chemin/une liaison permettant d'interconnecter l'instance de cet OCX sur mon projet VB6 et celle du programme externe, dans l'espoir de pouvoir récupérer les données.

J'ai aussi regardé du côté OLE, mais le GetObjet me renvoie dans les 22 (avec le ProgID fourni par "OLE 2 Object View" ) et l'illustrissime erreur 429.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
2 juin 2011 à 18:58
Je ne vois pas trop la démarche, mais qu'importe.
Je vais être en voyage de demain jusqu'au 19 juin. Avec mon portable.
T'est-til possible de m'envoyer par mail (à l'adresse que je te communique par MP) cet ocx et (si tu l'as) sa doc ?


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
2 juin 2011 à 20:59
Comme tu ne pourras pas mettre en situation cet OCX, ça me parait inutile.
Merci quand même
0