Ok, da es scheinbar keinen 'sauberen' Weg gibt, hab ich die Sache jetzt anders gelöst:
Beide Programme registrieren über RegisterWindowMessage() eine bestimmte Message WM_BLA. Das zu beendende Programm fängt diese ab und handelt entsprechend.
Der Updater schickt dann nur noch diese Message über
SendNotifyMessage(FindWindow(PChar('TKlassenname'), nil), WM_BLA, 0, 0);
Das halte ich für die sauberste Lösung, die auch auf allen Systemen funktionieren sollte. Löschen muss ich die Datei nicht mehr, da diese beim nächsten Start aufgrund der gelöschten Lizenzinfos sowieso die Arbeit verweigert ...
Und falls zufällig ein anderes Programm den gleichen Klassennamen verwendet, wird es bestimmt nicht auf WM_BLA reagieren.
Hat sich also doch gelohnt, sich Messages mal anzuschauen ...