/ / Qui est responsable de la mise à zéro du terminateur lors du traitement de TB_GETBUTTONTEXT? - Windows, Winapi, Visual C ++, gestion de la mémoire

Qui est responsable de mettre le terminateur null lors de la gestion de TB_GETBUTTONTEXT? - Windows, Winapi, Visual C ++, gestion de la mémoire

La documentation pour TB_GETBUTTONTEXT indique que le gestionnaire doit renvoyer le nombre de caractères et éventuellement (si lParam n'est pas nul) copiez la chaîne dans le tampon fourni.

La mise en garde est que la longueur n'inclut pas lecaractère de terminaison. Je vois le problème suivant. Supposons que le gestionnaire stocke la chaîne précalculée (sa longueur ne change donc pas). L’appelant envoie d’abord le message avec lParam mis à null - pour trouver le nombre de caractères -et le gestionnaire renvoie le nombre de caractères sans le null final. Ensuite, l’appelant alloue de la mémoire et envoie le message à nouveau - cette fois en transmettant l’adresse de la mémoire tampon comme suit: lParam.

Le gestionnaire doit-il copier le null final? Je veux dire si la première fois le gestionnaire est revenu N et l'appelant a alloué de l'espace pour N caractères et le gestionnaire ajoute un null final, puis un dépassement de tampon survient. Mais si l’appelant s’attend vraiment à ce que la chaîne soit terminée à zéro et s’attribue de l’espace pour N+1 Les caractères et le gestionnaire n’ajoutent pas la terminaison NULL. Le gestionnaire aura une chaîne qui n’est pas terminée par la valeur NULL et le dépassement de la mémoire tampon peut se produire (si l’appelant n’est pas assez prudent).

Alors, que doit faire le gestionnaire? Devrait-il copier le terminateur nul ou non?

Réponses:

2 pour la réponse № 1

MFC utilise l'approche rationnelle dans son implémentation CMFCToolBar :: OnGetButtonText (). Il suppose que l'appelant sait qu'il doit allouer N + 1 et utilise lstrcpy () pour copier le texte.