Das
Com zählt wieviele Zeiger auf ein Objekt sind, sind keine Zeiger mehr auf einem Objekt wird dieses Objekt freigegeben.
Delphi versucht das automatisch, mit dem Typcast auf Pointer geht das automatische verloren.
Das ComObj wird freigegeben und dein TTreenodezeiger zeigt ins leere mit dem Ergebnis Schutzverletzung.
Mit addref wird der Zeigerzähler (richtig: Referenzzähler) erhöht - ergo das Obj wird nicht freigegeben.
Wenn du dann den Treenode löscht muss! du allerdings den Zähler auch wieder manuell runterzählen.
Sonst wird das ComObj nie freigegeben.