/ / Wer ist für das Setzen des Nullterminators beim Umgang mit TB_GETBUTTONTEXT verantwortlich? - Windows, WinAPI, Visual-C ++, Speicherverwaltung

Wer ist verantwortlich für das Setzen des Nullabschlusses bei der Behandlung von TB_GETBUTTONTEXT? - Windows, Winapi, Visual-C ++, Speicherverwaltung

Die Dokumentation für TB_GETBUTTONTEXT sagt, dass der Handler die Anzahl der Zeichen zurückgeben muss und optional (wenn lParam ist nicht null) kopiere den String in den mitgelieferten Puffer.

Der Vorbehalt ist, dass die Länge nicht dieAbschlusszeichen. Ich sehe das folgende Problem. Angenommen, der Handler speichert die vorberechnete Zeichenfolge (damit sich ihre Länge nicht ändert). Zuerst sendet der Anrufer die Nachricht mit lParam auf null setzen - um die Anzahl der Zeichen zu ermitteln -und der Handler gibt die Anzahl der Zeichen ohne die abschließende Null zurück. Dann reserviert der Anrufer Speicher und sendet die Nachricht erneut - diesmal übergibt er die Pufferadresse als lParam.

Sollte der Handler die abschließende Null kopieren? Ich meine, wenn der Hundeführer zum ersten Mal zurückkommt N und dem Anrufer zugeordneter Platz für N Zeichen und der Handler hängt eine abschließende Null an, dann tritt ein Pufferüberlauf auf. Aber wenn der Aufrufer wirklich erwartet hat, dass die Zeichenfolge mit Null beendet wird und Speicherplatz für reserviert wird N+1 Zeichen und der Handler fügt das Null-Abschlusszeichen nicht an, der Handler hat eine Zeichenfolge, die nicht mit Null abgeschlossen ist, und es kann erneut zu einem Pufferüberlauf kommen (wenn der Aufrufer nicht vorsichtig genug ist).

Also, was soll der Handler tun? Sollte es den Nullterminator kopieren oder nicht?

Antworten:

2 für die Antwort № 1

MFC verwendet in seiner CMFCToolBar :: OnGetButtonText () -Implementierung den vernünftigen Ansatz. Es wird davon ausgegangen, dass der Aufrufer weiß, dass er N + 1 zuweisen soll, und verwendet lstrcpy (), um den Text zu kopieren.