上面的解決方案依賴於您要存儲進 Stream 中的字符串的編碼格式,建議使用 TEncoding 類來更好的對格式進行處理。
FillChar(, , ) 如果采用 #0 填充, 替換為 * SizeOf(Char);如果填充其它字符,替換為 StringOfChar 函數
范例:
var
Count: Integer;
Buffer: array[0..255] of Char;
// 本文轉自 C++Builder研究 - http://www.ccrun.com/article.ASP?i=1052&d=155e7c
begin
// 現有代碼 - 當 string = UnicodeString ( char = 2 字節) 時,這段代碼是錯的
Count := Length(Buffer);
FillChar(Buffer, Count, 0);
// 正確的代碼應該寫作下面這樣
Count := SizeOf(Buffer); // <<-- Specify buffer size in bytes
Count := Length(Buffer) * SizeOf(Char); // <<-- Specify buffer size in bytes
FillChar(Buffer, Count, 0);
end;
Length 返回的是字符數,而 FillChar 的 Count 參數需要的是字節數,所以必須用 SizeOf 替換 Length,或者使用 Length * SizeOf(Char)。
另外,需要注意的是,Tiburon 中 Char 等於 2 個字節,FillChar 填充的時候確是按照 Bytes 來計算的,所以,下面的代碼
var
Buf: array[0..32] of Char;
begin
FillChar(Buf, Length(Buf), #9);
end;
並不是向目標中填充 $09,而是 $0909,要得到正確的數值,應該改寫成下面這樣:
var
Buf: array[0..32] of Char;
begin
StrPCopy(Buf, StringOfChar(#9, Length(Buf)));
...
end;
GetProcAddress(, )
由於 GetProcAddres 沒有對應的 *W (Unicode) 版本的 API,所以只能使用下面的代碼來正確調用它:
procedure CallLibraryProc(const LibraryName, ProcName: string);
var
Handle: THandle;
RegisterProc: function: HResult stdcall;
begin
Handle := LoadOleControlLibrary(LibraryName, True);
@RegisterProc := GetProcAddress(Handle, PAnsiChar(AnsiString(ProcName)));
end;
RegQueryValueEx 函數