Vielleicht zu umständlich, aber mit
NtQuerySystemInformation kannst du alle offenen Handles enumerieren. Die kannst du dann mit deinen temporären Dateien abgleichen und wüsstest so zumindest schonmal, welche Datei noch irgendwo geöffnet ist.
Anderer Ansatz wäre das Starten der externen Programme in einem extra Thread, den du mit
WaitForSingleObject auf Beendigung des Prozesses warten lässt.