Wenn ich die Callback-Funktion als normale procedure deklariere klappt gar nichts mehr. Habe es deshalb anders versucht. Ich übergebe eine StringList, die dann gefüllt werden soll.
Sieht dann so aus:
Delphi-Quellcode:
procedure ADsEnumerateObjects(Container : IADsContainer; liste: TStringlist);
var
e : IEnumVARIANT;
varArr : OleVariant;
lNumElements : ULong;
obj : IADs;
hr : integer;
begin
hr := ADsBuildEnumerator(Container,e);
while(Succeeded(Hr)) do
begin
hr := ADsEnumerateNext(e,1,
varArr ,lNumElements);
if (lNumElements=0) then
break;
IDispatch(varArr).QueryInterface(IADs, obj);
if obj<>nil then
begin
liste.add(obj.name);
end;
varArr := NULL;
end;
// do not call ADsFreeEnumerator(e); since e will be released by Delphi
end;
Aber auch das geht nicht. Ich kann anschließend NICHT auf die Stringlist zugreifen, es kommen wieder die gleichen Exceptions. Was kann das sein?? Ich komme hier echt nicht weiter. Es geht darum, ich möchte rekursiv Objekte auflisten. Die Ojekte werden z.B: so ausgegeben:
CN=MustermannO
OU=arbeiter
Nun überprüfe ich, ob es sich um eine Organisationseinehit (OU) handelt, wenn ja übergebe ich diese als Pfad an die procedure. Die Rekursionsprocedure sieht so aus:
Delphi-Quellcode:
procedure auflistenrek(pfad:
string; parent: TTreeNode; Tree: TTreeView);
var container: IADsContainer;
i, level: integer;
p:
string;
liste: TStringlist;
begin
if pfad='
'
then p:='
'
//beim ersten Aufruf ist der Pfad=''
else p:=pfad+'
,';
//wenn nicht, muss am Ende des Pfades ein Komma stehen
liste:=TStringList.Create;
ADsGetObject('
LDAP://'+p+'
DC=test,DC=local', IADsContainer, container);
//LDAP-Query
container.Filter := VarArrayOf(['
OrganizationalUnit','
user']);
//Filtern nach OUs und Usern
ADsEnumerateObjects(container, liste);
//hier das Problemkind
for i:=0
to liste.Count-1
do begin
if parent=nil
then t:=tree.Items.Add(
NIL,liste.strings[i])
else t:=tree.Items.AddChild(parent,liste.strings[i]);
if copy(liste.strings[i],0,2)='
OU'
then begin
if p='
'
then p:=liste.strings[i]
else p:=liste.strings[i]+'
,'+p;
//für LDAP müssen die OUs von innen nach außen gelistet werden
auflistenrek(p,t,tree);
end;
end;
liste.Free;
end;
Ist da ein Fehler drin? Bitte helft mir.