Einzelnen Beitrag anzeigen

Markus
(Gast)

n/a Beiträge
 
#3

Re: Extrem seltsames verhalten einer procedure...

  Alt 31. Mai 2004, 10:38
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)='OUthen 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.
  Mit Zitat antworten Zitat