Beispiel an einer kurzen Methode:
Delphi-Quellcode:
procedure FETCP_CheckError(iErrorCode: Integer);
var
Temp:
array[0..255]
of AnsiChar;
begin
if iErrorCode < 0
then
if FEUSB_GetErrorText(iErrorCode, @Temp[0]) < 0
then
raise Exception.CreateFmt('
FEUSB: unknown error code %d', [iErrorCode]) at ReturnAddress
else
raise Exception.CreateFmt('
%s', [iErrorCode,
string(Temp)]) at ReturnAddress;;
end;
end;
Was Delphi früher mal alles automatisch machte, darf man jetzt selber machen.
- Speicher reservieren
- das Ende des PAnsiChar suchen
- den String kopieren und nach Unicode umwandeln
Delphi-Quellcode:
procedure FEUSB_CheckError(iErrorCode: Integer);
var
Temp: TBytes;
Len: Integer;
begin
if iErrorCode < 0
then begin
SetLength(Temp, 256);
if FEUSB_GetErrorText(iErrorCode, @Temp[0]) >= 0
then begin
Len := 0;
while (Len < 256)
and (Temp[Len] <> 0)
do
Inc(Len)
raise Exception.CreateFmt('
%s', [iErrorCode, TEncoding.
Default.GetString(Temp, 0, Len)]) at ReturnAddress;
// Default heißt jetzt ANSI, was im Grunde auch besser ist, aber XE kennt es noch nicht
end else
raise Exception.CreateFmt('
FEUSB: unknown error code %d', [iErrorCode]) at ReturnAddress;
end;
end;
Gut, es ginge bestimmt auch so, aber wer weiß, ob sich TEncoding nicht an der #0 und den "ungültigen" Zeichen verschluckt.
Der statische Record geht auch nicht mehr, da die Pointer-Funktionen vom TEncoding im Strict-Protected versteckt sind und ich keine Lust hatte mir das erst freizuschalten, also alles immer schön in den langsamen Speichermanager, anstatt mal eben schnell auf den Stack.
Delphi-Quellcode:
procedure FEUSB_CheckError(iErrorCode: Integer);
var
Temp: TBytes;
begin
if iErrorCode < 0
then begin
SetLength(Temp, 256);
if FEUSB_GetErrorText(iErrorCode, @Temp[0]) >= 0
then
raise Exception.CreateFmt('
%s', [iErrorCode, PChar(TEncoding.
Default.GetString(Temp))]) at ReturnAddress;
else
raise Exception.CreateFmt('
FEUSB: unknown error code %d', [iErrorCode]) at ReturnAddress;
end;
end;
Ich dachte mal, es würde mit der Zeit leichter werden, da die
RTL Einem immer mehr Arbeit abnimmt.
Oder hab ich was übersehn?