Sicher ist das schon.
Man hätte auch über AsAnsiString gehn können, die AnsiChar nach Byte, oder gleich alles zusammen nach TGUID gecastet,
aber da könnte es Probleme geben, wenn in der
GUID auch nur ein byte auf 0 steht, wegen der PChar #0.
Zusätzlich hätte man danach noch über GUIDToString umgewandelt, wenn man die Textausgabe benötigt.
Wenn du die die Begrenzung vorher prüfst, dnan könntest du sie in der Schleife aös gegeben hinnehmen und müsßtest sie nicht unbeding nochmals abfragen.
Aber VarArrayLowBound sollte man sicherheitshalber noch mit prüfen.
Delphi-Quellcode:
function VariantGUIDToStr(VarGUID: Variant): String;
var
I: Integer;
ByteGUID: array[0..15] of byte;
begin
result := '';
if VarIsArray(VarGUID) and (VarArrayLowBound(VarGUID,1) = 0) and (VarArrayHighBound(VarGUID,1) = 15) then
begin
for I := 0 to 15 do
ByteGuid[I] := VarGUID[I];
result := GUIDToString(TGUID(ByteGUID));
end;
end;
Oder du prüfst die Größe des Arrays, wobei es hier egal ist, wie die Low-Grenze aussieht. (z.B. 0-15 oder 1-16)
Delphi-Quellcode:
function VariantGUIDToStr(VarGUID: Variant): String;
var
I: Integer;
ByteGUID: array[0..15] of byte;
begin
result := '';
if VarIsArray(VarGUID) and (VarArrayHighBound(VarGUID,1) - VarArrayLowBound(VarGUID,1) + 1 = 16) then
begin
for I := VarArrayLowBound(VarGUID,1) to VarArrayHighBound(VarGUID,1) do
ByteGuid[I - VarArrayLowBound(VarGUID,1)] := VarGUID[I];
result := GUIDToString(TGUID(ByteGUID));
end;
end;
Eventuell geht auch sowas?
Delphi-Quellcode:
function VariantGUIDToStr(VarGUID: Variant): String;
begin
if VarIsArray(VarGUID) and (VarType(VarGUID) = varArray or varByte) and (VarArrayDimCount(VarGUID) = 1)
and (VarArrayHighBound(VarGUID,1) - VarArrayLowBound(VarGUID,1) + 1 = 16) then begin
Result := GUIDToString(PGUID(VarArrayLock(VarGUID))^);
VarArrayUnlock(VarGUID);
end else
Result := '';
end;