自訂字串管理員實作 (進階方法)
在特殊情況下,您可能想要實作自定義字串管理員,只變更用來配置記憶體的堆積。 在此情況下,您必須手動實 作 IAtlStringMgr 介面作為自定義字串管理員。
若要這樣做,請務必先瞭解 CStringT 如何使用該介面來管理其字串數據。 的每個實例CStringT
都有 CStringData 結構的指標。 這個可變長度結構包含字串的重要資訊(例如 length),以及字串的實際字元數據。 每個自定義字串管理員都會負責在的要求 CStringT
下配置和釋放這些結構。
結構 CStringData
包含四個字位:
pStringMgr 此字段會指向
IAtlStringMgr
用來管理此字串數據的介面。 當CStringT
需要重新配置或釋放字串緩衝區時,它會呼叫這個介面的 Reallocate 或 Free 方法,將CStringData
結構傳遞為參數。 在字串管理員中配置CStringData
結構時,您必須將此欄位設定為指向您的自訂字串管理員。nDataLength 此字段包含目前儲存在緩衝區中之字串的邏輯長度,但不包括終止 Null。
CStringT
當字串的長度變更時,會更新此欄位。 配置CStringData
結構時,您的字串管理員必須將此欄位設定為零。 重新配置CStringData
結構時,您的自定義字串管理員必須讓此欄位保持不變。nAllocLength 此字段包含可以儲存在此字串緩衝區中而不重新配置的最大字元數(不包括終止 Null)。 每當
CStringT
需要增加字串的邏輯長度時,它會先檢查此欄位,以確定緩衝區中有足夠的空間。 如果檢查失敗,CStringT
請呼叫自定義字串管理員以重新配置緩衝區。 配置或重新配置CStringData
結構時,您必須將此字段設定為至少 nChars 參數中要求的字元數目為 IAtlStringMgr::Allocate 或 IAtlStringMgr::Reallocate。 如果緩衝區中有比要求更多的空間,您可以設定此值以反映可用的實際空間量。 這可讓CStringT
字串成長以填滿整個已配置的空間,然後才必須回呼至字串管理員以重新配置緩衝區。nRefs 此欄位包含字串緩衝區的目前參考計數。 如果值為其中一個,則的單一實例
CStringT
會使用 緩衝區。 此外,實例也允許讀取和修改緩衝區的內容。 如果值大於一個,則的CStringT
多個實例可以使用 緩衝區。 因為字元緩衝區是共用的,CStringT
因此實例只能讀取緩衝區的內容。 若要修改內容,CStringT
請先建立緩衝區的複本。 如果值為負數,則 只有一個 實例CStringT
使用緩衝區。 在此情況下,緩衝區會被視為已鎖定。CStringT
當實例使用鎖定的緩衝區時,沒有其他 實例CStringT
可以共用緩衝區。 相反地,這些實例會在操作內容之前建立緩衝區的複本。 此外,使用鎖定緩衝區的CStringT
實例不會嘗試共用指派給它的任何其他CStringT
實例的緩衝區。 在此情況下,實例會將CStringT
另一個字串複製到鎖定的緩衝區。配置
CStringData
結構時,您必須設定此欄位,以反映緩衝區允許的共用類型。 針對大部分的實作,請將此值設定為一個。 這允許一般寫入時複製共享行為。 不過,如果您的字串管理員不支援共用字串緩衝區,請將此欄位設定為鎖定狀態。 這會強制CStringT
只針對配置它的 實例CStringT
使用此緩衝區。