Implementierung eines benutzerdefinierten Zeichenfolgenmanagers (fortgeschrittene Methode)
In speziellen Situationen möchten Sie möglicherweise einen benutzerdefinierten Zeichenfolgen-Manager implementieren, der mehr als nur die Änderung des Heaps zum Zuweisen von Arbeitsspeicher ausführt. In diesem Fall müssen Sie die IAtlStringMgr-Schnittstelle manuell als benutzerdefinierten Zeichenfolgen-Manager implementieren.
Um dies zu tun, ist es wichtig, zunächst zu verstehen, wie CStringT diese Schnittstelle verwendet, um seine Zeichenfolgendaten zu verwalten. Jede Instanz von CStringT
weist einen Zeiger auf eine CStringData-Struktur auf. Diese Struktur mit variabler Länge enthält wichtige Informationen zur Zeichenfolge (z. B. Länge) sowie die tatsächlichen Zeichendaten für die Zeichenfolge. Jeder benutzerdefinierte Zeichenfolgen-Manager ist für das Zuweisen und Freigeben dieser Strukturen auf Anforderung verantwortlich CStringT
.
Die CStringData
Struktur umfasst vier Bereiche:
pStringMgr Dieses Feld verweist auf die Schnittstelle, die
IAtlStringMgr
zum Verwalten dieser Zeichenfolgendaten verwendet wird. WennCStringT
der Zeichenfolgenpuffer neu zugeordnet oder freigegeben werden muss, ruft er die Methoden "Reallocate" oder "Free" dieser Schnittstelle auf, und übergibt dieCStringData
Struktur als Parameter. Beim Zuweisen einerCStringData
Struktur im Zeichenfolgen-Manager müssen Sie dieses Feld so festlegen, dass es auf den benutzerdefinierten Zeichenfolgen-Manager verweist.nDataLength Dieses Feld enthält die aktuelle logische Länge der im Puffer gespeicherten Zeichenfolge mit Ausnahme des endenden Null-Werts.
CStringT
aktualisiert dieses Feld, wenn sich die Länge der Zeichenfolge ändert. Beim Zuordnen einerCStringData
Struktur muss der Zeichenfolgen-Manager dieses Feld auf Null festlegen. Wenn Sie eineCStringData
Struktur neu zuweisen, muss der benutzerdefinierte Zeichenfolgen-Manager dieses Feld unverändert lassen.nAllocLength Dieses Feld enthält die maximale Anzahl von Zeichen (mit Ausnahme der endierenden NULL), die in diesem Zeichenfolgenpuffer gespeichert werden kann, ohne sie neu zuzuweisen. Jedes Mal
CStringT
, wenn die logische Länge der Zeichenfolge erhöht werden muss, überprüft es zunächst dieses Feld, um sicherzustellen, dass genügend Speicherplatz im Puffer vorhanden ist. Wenn die Überprüfung fehlschlägt, rufen Sie den benutzerdefinierten Zeichenfolgen-Manager auf,CStringT
um den Puffer neu zu gliedern. Wenn Sie eineCStringData
Struktur zuordnen oder neu zuordnen, müssen Sie dieses Feld mindestens auf die Anzahl der zeichen festlegen, die im Parameter "nChars " an "IAtlStringMgr::Allocate " oder "IAtlStringMgr::Reallocate" angefordert wurden. Wenn im Puffer mehr Speicherplatz vorhanden ist als angefordert, können Sie diesen Wert so festlegen, dass er die tatsächliche Verfügbare Speicherplatzmenge widerspiegelt. Dadurch kannCStringT
die Zeichenfolge vergrößert werden, um den gesamten zugewiesenen Speicherplatz auszufüllen, bevor der Zeichenfolgen-Manager wieder in den Zeichenfolgen-Manager zurückgerufen werden muss, um den Puffer neu zuzuordnen.nRefs Dieses Feld enthält die aktuelle Bezugsanzahl des Zeichenfolgenpuffers. Wenn der Wert eins ist, verwendet eine einzelne Instanz
CStringT
den Puffer. Darüber hinaus kann die Instanz sowohl den Inhalt des Puffers lesen als auch ändern. Wenn der Wert größer als eins ist, können mehrere Instanzen des PuffersCStringT
verwenden. Da der Zeichenpuffer freigegeben ist,CStringT
können Instanzen nur den Inhalt des Puffers lesen. Um den Inhalt zu ändern,CStringT
wird zunächst eine Kopie des Puffers erstellt. Wenn der Wert negativ ist, wird nur eine Instanz des PuffersCStringT
verwendet. In diesem Fall gilt der Puffer als gesperrt. Wenn eineCStringT
Instanz einen gesperrten Puffer verwendet, können keine anderen Instanzen desCStringT
Puffers gemeinsam verwendet werden. Stattdessen erstellen diese Instanzen eine Kopie des Puffers, bevor sie den Inhalt bearbeiten. Darüber hinaus versucht die Instanz, dieCStringT
den gesperrten Puffer verwendet, nicht, den Puffer einer anderenCStringT
Instanz freizugeben, die ihm zugewiesen wurde. In diesem Fall kopiert dieCStringT
Instanz die andere Zeichenfolge in den gesperrten Puffer.Wenn Sie eine
CStringData
Struktur zuordnen, müssen Sie dieses Feld so festlegen, dass er den Typ der Freigabe widerspiegelt, die für den Puffer zulässig ist. Legen Sie diesen Wert für die meisten Implementierungen auf einen fest. Dies ermöglicht das übliche Kopier-on-Write-Freigabeverhalten. Wenn ihr Zeichenfolgen-Manager jedoch die Freigabe des Zeichenfolgenpuffers nicht unterstützt, legen Sie dieses Feld auf einen gesperrten Zustand fest. Dies erzwingtCStringT
nur die Verwendung dieses Puffers für die Instanz, dieCStringT
sie zugewiesen hat.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für