Bitte entschuldigt, dass ich diesen alten Thread ausgrabe, habe aber wirklich mit Unterbrüchen bis jetzt nach einer Lösung dieses Problems gesucht und möchte deshalb Lösung posten. Vielleicht hilft's ja jemandem, nicht ebenfalls so lange suchen zu müssen.
Das Problem ist zweiteilig. LDAP/ADO liefert zum Teil Felder als Variant Arrays zurück (z.B. Description bei Computers). Solche Felder können mit folgener Funktion in Strings umgewandelt werden:
{Variant-Rückgabe in String umsetzen}
function TFADAbgl.VariToStr(Vari : Variant) : string;
var j : integer;
var s : string;
var t : Variant;
begin
if (VarIsArray(Vari)) and not (VarIsNull(Vari)) then
begin
s := '';
t := Vari;
for j := VarArrayLowBound(t, 1) to VarArrayHighBound(t, 1) do
begin
if (s <> '') then
s := s + ', ';
s := s + t[j];
end;
end
else
if (not (VarIsNull(Vari))) then
s := VarToStr(Vari);
Result := s;
end;
Der 2 Knackpunkt sind gewisse Datumfelder wie LastLogon oder LastLogoff bei Computer welche als sogenannte Dispatch-Felder geliefert werden.
Damit diese Felder umgesetzt werden können ist folgendes nötigt:
- ActiveDS_TLB bei uses einfügen
- folgende Felder definieren
var ft : TFileTime;
var lt : TFileTime;
var st : TSystemTime;
var dt : TDateTime;
var lis : IADsLargeInteger;
var myVar : Variant;
myVar := ADODataSet2.FieldbyName('lastLogon').AsVariant;
lis := IDispatch(myVar) as IADsLargeInteger;
ft.dwLowDateTime := Lis.LowPart;
ft.dwHighDateTime := lis.HighPart;
FileTimeToLocalFileTime(ft, lt);
FileTimeToSystemTime(lt, st);
dt := SystemTimeToDateTime(st);
Dieser Code setzt so ein Datumdeld um