天天看點

CBSCore 中的字元串 SCZ

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 把字元串中的環境變量擴充成實際值

繼續閱讀