2014-09-23 56 views
2

這是我第一次安裝Lockbox的庫。我從sourceforge下載了3.4.3版,並且安裝了Delphi 7.第一步是讓這個sucker在Delphi 7下編譯,這真是太糟糕了。我確實希望組件安裝後更易於使用。如何將LockBox 3安裝到Delphi 7中?

好的。我有一個看起來像這樣的單位。

unit uTPLb_StrUtils; 

interface 

uses 
    SysUtils, uTPLb_D7Compatibility; 

function AnsiBytesOf(const S: string): TBytes; 

implementation 

function AnsiBytesOf(const S: string): TBytes; 
begin 
//compiler chokes here 
    **Result := TEncoding.ANSI.GetBytes(S);** 
end; 

end. 

順便說一下,兼容性單元將TBytes定義爲TBytes =字節的打包數組;

關於TEncoding的Delphi 7扼流圈,因爲它只存在於D2009 +中。我該用什麼替換這個功能?

回答

4

String是在Delphi 7 8位AnsiString簡單地分配TBytes字符串的Length()Move()字符串內容到它:

function AnsiBytesOf(const S: AnsiString): TBytes; 
begin 
    SetLength(Result, Length(S) * SizeOf(AnsiChar)); 
    Move(PChar(S)^, PByte(Result)^, Length(Result)); 
end; 

如果你想成爲政治正確搭配什麼TEncoding.GetBytes()呢,您必須將String轉換爲WideString,然後使用Win32 API WideCharToMultiBytes()函數將其轉換爲字節:

function AnsiBytesOf(const S: WideString): TBytes; 
var 
    Len: Integer; 
begin 
    Result := nil; 
    if S = '' then Exit; 
    Len := WideCharToMultiByte(0, 0, PWideChar(S), Length(S), nil, 0, nil, nil); 
    if Len = 0 then RaiseLastOSError; 
    SetLength(Result, Len+1); 
    WideCharToMultiByte(0, 0, PWideChar(S), Length(S), PAnsiChar(PByte(Result)), Len, nil, nil); 
    Result[Len] = $0; 
end; 
0
function Quux(const S: AnsiString): TBytes; 
var 
    Count: Integer; 
begin 
    Count := Length(S) * SizeOf(AnsiChar); 
    {$IFOPT R+} 
    if Count = 0 then Exit; // nothing to do 
    {$ENDIF} 
    SetLength(Result, Count); 
    Move(S[1], Result[Low(Result)], Count); 
end; 
+2

如果'AnsiString'爲空,則訪問'S [1]'將會出現邊界錯誤。 – 2014-09-23 16:58:44

+0

@RemyLebeau,剛剛用我的XE2進行測試,並沒有,嗯。 – 2014-09-23 17:03:31

+0

在我的XE2上,如果啓用了範圍檢查,訪問空白'AnsiString'的'S [1]'會引發一個'ERangeError',否則當從地址$ 00000000讀時會引發一個'EAccessViolation'(這有意義,因爲空字符串是一個'nil'指針)。 – 2014-09-23 17:38:08