Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lire une zone de texte par API

13 réponses
Avatar
Gloops
Bonjour tout le monde,

Je cherche à copier le contenu d'une zone de texte d'une application
extérieure, par exemple vers un fichier texte.

Pour cela, il m'a semblé que SendMessage pouvait être un bon filon,
j'espère ne pas m'être trompé. Alors je commence par faire des exercices.

Je me suis référé à ce qui est fourni avec VB6, à savoir une copie de la
fiche 141073. Pour la trouver dans HTML de VB6, on peut y chercher par
exemple EM_GETLINE, et trouver dans les rubriques "Using Windows API
Functions to Better Manipulate Text Boxes".

Il faut mettre les déclarations au goût du jour :
Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_GETLINE = &HC4
Private Const EM_LINELENGTH = &HC1
Private Const EM_GETSEL = &HB0
Private Const EM_LINEFROMCHAR = &HC9
Private Const EM_LINEINDEX = &HBB
Private Const EM_SETSEL = &HB1
Private Const EM_REPLACESEL = &HC2

J'ai désactivé la deuxième instruction de Form_Load,
X% = fReplaceSel("")
le motif en est indiqué par le commentaire.

ça démarrait bien, et puis l'application s'est plantée, et VB6 avec.

J'ai tout remis en place, et il s'avère que le plantage se produit dans
fGetLine, au niveau de SendMessage

hWnd = GetFocus()
Pos& = SendMessage(hWnd, EM_GETLINE, CInt(LineNumber), Buffer)

Un peu plus haut, ça n'a pas suffi d'agrandir un peu le buffer, de 2
octets, ni ensuite de le doubler :
Buffer = Chr$(byteLo%) + Chr$(byteHi%) _
+ Space$(2 * MAX_CHAR_PER_LINE) ' exit - 2)

- 2 ou pas - 2, doublé ou pas doublé la taille du buffer, même motif
même punition, VB manque de mémoire, alors il se suicide.

Qui saura le dissuader de franchir le parapet ?

3 réponses

1 2
Avatar
Gloops
Zoury a écrit, le 23/06/2005 16:32 :
Enfin si ça
commence à se mettre un peu en place dans ma petite tête ...




Ça m'a l'air d'être le cas. :O)



Bonne nouvelle :)
Avatar
Gloops
Bon, alors pour le premier point, OK tu développes, mais alors pour
finir, j'avais bien compris, c'est LenB qui n'était pas adapté ?

Picalausa François a écrit, le 23/06/2005 15:39 :
LenB("AIDE") renvoie 8
donc, on va copier 8 octets d'une chaine ANSI (1 octet/caractère) d'une
chaine qui n'en comporte que 4... il y aura donc des données non réservées à
la chaine après le 5ème (caractère nul de fin de chaine). De ce fait, elles
peuvent contenir les données de n'importe quelle autre variable.
La lecture n'est peut-être (quoi que?) pas bien méchant, mais maintenant,
supposons qu'au lieu de lire ces caractères non initialisé, on écrive des
caractères dans un espace qui ne nous est pas réservé... Et paf! c'est le
buffer overrun.
Cela explique que ça fonctionne avec Len.


Avatar
Gloops
Ah, à partir des liens contenus dans cette doc, surtout de celui qui est
périmé, j'ai trouvé une autre doc, sur un sujet un peu proche, et dont
j'ai pu voir les shémas par IE.
http://msdn.microsoft.com/library/en-us/dnw32dev/html/ora_apiprog6_topic1.asp

On dirait que c'est un sujet qui peut faire couler pas mal d'encre et
d'octets, voire de caractères Unicode ...

Picalausa François a écrit, le 22/06/2005 20:03 :

Hello,

En fait, il faut savoir que tu veux passer un pointeur vers une chaine
(Byval) et pas un pointeur vers un pointeur vers une chaine (Byref).
Tout cela est expliqué plus en détail dans le livre blanc à ce sujet:
http://www.microsoft.com/downloads/details.aspx?familyidÎ7DA635-78A1-457E-9959-C3996CF25C03&displaylang=fr



1 2