由於 RegQueryValueEx 函數的 Len 指定的是字節數,而不是字符數,所以 Unicode 版本中它的大小是實際需要大小的 2 倍,所以這樣的代碼:
Len := MAX_PATH;
if RegQueryValueEx(reg, PChar(Name), nil, nil, PByte(@Data[0]), @Len) = ERROR_SUCCESS
then
SetString(Result, Data, Len - 1) // Len includes #0
else
RaiseLastOSError;
應該換成下面這樣:
Len := MAX_PATH * SizeOf(Char);
if RegQueryValueEx(reg, PChar(Name), nil, nil, PByte(@Data[0]), @Len) = ERROR_SUCCES
then
SetString(Result, Data, Len div SizeOf(Char) - 1) // Len includes #0, Len contains the number of bytes
else
RaiseLastOSError;
CreateProcessW 函數
在 Unicode 版本的 CreateProcess 函數中,其行為和 ANSI 的版本略有不同。Unicode 的 CreateProcessW 會改變參數 lpCommandLine 傳入的數據,因此調用 CreateProcess / CreateProcessW 的時候,不可以給 lpCommandLine 賦值常量,或者是一個變量指向的常量,否則函數會拋出 Access violations 的異常。下面是錯誤的代碼:
// 傳入了一個 string 常量
CreateProcess(nil, 'foo.exe', nil, nil, False, 0,
nil, nil, StartupInfo, ProcessInfo);
// 傳入了一個常量表達式
const
cMyExe = 'foo.exe'
CreateProcess(nil, cMyExe, nil, nil, False, 0,
nil, nil, StartupInfo, ProcessInfo);
// 傳入了一個引用計數為 -1 的字符串:
const
cMyExe = 'foo.exe'
var
sMyExe: string;
sMyExe := cMyExe;
CreateProcess(nil, PChar(sMyExe), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
LeadBytes 常量
早先的版本中 LeadBytes 常量包含了本地系統中所有可以作為雙字節字符 LeadByte 的列表,常常有這樣的代碼:
if Str[I] in LeadBytes then
現在你需要將它改成調用 IsLeaderChar 函數
if IsLeadChar(Str[I]) then
使用 TMemoryStream 類