mit etwas Glück konnte ich def Fehler selbst finden :-)
für die Nachwelt, hier meine Lösung:
das DADUser._Release darf nicht (!) aufgerufen werden - statt dessen direkt NIL zuweisen, und schon geht's besser (Zumindest kommt der Stack nicht mehr durcheinander)
Delphi-Quellcode:
finally
//if DADUser <> nil then
// DADUser._Release;
DADUser:=nil;
...
end;
Ausserdem musste meine Function so aufrufen
Delphi-Quellcode:
asm
push ESI;
push EDI;
end;
Res:=HRtoAD(DHR);
asm
pop EDI;
pop ESI;
end;
die Register ESI und EDI werden anscheinend durch den Aufruf von ADsOpenObject umgebogen und nicht korrekt wiederhergestellt.
Folge war, dass der erste Aufruf der Funktion zwar geklappt hatte, daraufhin aber einige Variablen, nicht mehr erreichbar waren.
vielleicht kann das ja mal jemandem helfen!