CBSCore 中的字元串 SCZ
CBSCore 中的字元串 SCZ 類似于 WCHAR*,但是,有一點不同,就是在WCHAR* 前 -1 位,儲存了字元串的長度。
引用的位址還是 WCHAR* 的起始位置。
不知道是怎麼實作的。
由于不知道如何表示 -1 位的長度,是以也就沒有辦法實作 SCZ 結構。
好在可以用系統提供的函數進行初始化,但是,隻能用PSCZ 表示,即指向 SCZ 的位址。
但是,再複雜也可以不管,讓系統自己去做,我們隻要把SCZ 對象的位址儲存下來就可以了,是以,把PSCZ 定義成WCHAR*。
直接就按照内容,把它定義成:
typedefWCHAR *PSCZ;
CBSCore 中的許多字元串都是使用了這種格式。
如果直接用 WCHAR* 代替 SCZ,函數運作也能運作,且結果也正确,但是,在退出時會出現 0xc0000374 堆破壞的錯誤。這是因為在結束函數前要釋放變量,釋放 SCZ 變量,不權要釋放 SCZ 變量指針指向的 WCHAR* 字元串,還要釋放 SCZ 變量的前一位,即字元串的長度。
如果是用 WCHAR* 代替 SCZ 的話,SCZ 變量的前一位由于沒有初始化,那麼釋放這一位,就必然出錯了。
為了友善轉換,CBSCore 提供了十多個函數(64 位系統與 32 位系統提供的函數數量不同)。
用法:
聲明變量:
PSCZ *v10 = newPSCZ();
初始化成指定長度的空字元串:
SczAlloc(v10,16);
用 WCHAR* 字元串進行初始化,也可以說是轉換:
SczAllocFromSz(v10, L"C:\\Windows");
把PSCZ 轉換成 WCHAR* 格式
WCHAR *scz = *v10;
應用示例:
LPCWSTRlpSrc = L"%SystemRoot%\\winsxs\\x86_microsoft-windows-servicingstack_31bf3856ad364e35_6.3.9600.18384_none_9dfef83fe2e442e4";
PSCZ *lpDst = newPSCZ();
SczAllocFromSz(lpDst, lpSrc);
FileExpandPath(*lpDst, lpDst);
SczEnsureBackslashTerminated(lpDst);
PSCZ *lpStackDirectory = newPSCZ() ;
FindServicingStackDirectory(lpStackDirectory);
LoadCbsCoreOnline();
提供的一些函數:
函數名 | 功能 |
SczAlloc | 初始化指定長度 |
SczAllocConcat2Sz | 連接配接兩個 WCHAR* 字元串到 SCZ |
SczAllocConcatSz | 連接配接一個 WCHAR* 字元串到 SCZ |
SczAllocConcatSzFast | 連接配接一個 WCHAR* 字元串到 SCZ |
SczAllocFormatted | 調用SczAllocFormattedArgs |
SczAllocFormattedArgs | 類似 print 中的格式化參數 |
SczAllocFromAnsiSz | 連接配接一個Ansi 字元串到 SCZ 先MultiByteToWideChar |
SczAllocFromStringTable | |
SczAllocFromSz | 轉換WCHAR* 到 PSCZ 格式 |
SczAllocFromSzAndEnsureBackslash | 轉換 WCHAR* 到 PSCZ 格式,保證結尾有 \ |
SczAllocPrefixSz | 轉換 WCHAR* 到 PSCZ 格式,用指定的字首 |
SczAllocConcatUnicodeString | 連接配接一個Unicode 字元串到 SCZ |
SczEnsureBackslashTerminated | 轉換 WCHAR* 到 PSCZ 格式,保證結尾有 \ |
SczGrowIfNeeded | 增加字元串的長度 |
SczPublicAllocFromSz | 轉換有接口的字元串pMalloc |
SczPublicFree | 釋放有接口的字元串 pMalloc |
SczSize | 計算 SCZ 字元串的長度,實作就是讀 -1 處的值 |
FileExpandPath | 把字元串中的環境變量擴充成實際值 |