Jay, jetzt's wirds kritisch. Das lässt sich so ohne weiteres nicht ändern, leider. Es liegt an der Vorgehensweise wie die Shell = Explorer eine Anwendung startet. Sie hat die 3 Dateien und erzeugt mit CreateProcess() 3 mal deinen Prozess. ABER! sie gibt diesen 3 neuen Prozessen erst dann eine Chance anzulaufen wenn alle 3 Prozesse schon erzeugt wurden. Deshalb ist es enorm wichtig den "Einmal-Startcode" so früh und so effizient wie möglich einzubauen. Leider bewirkt die Benutzung von Fensterhandles in unserem "Einmal-Startcode" das auch die beiden anderen Prozesse Rechenzeit bekommen, noch bevor überhaupt ein Fensterhandle vollständig erzeugt wurde.
Man kann dies ändern, aber das wird vom Verständnis echt komplizierter. Dafür müssen wir auf Semaphores und Interprozesskommunikation ausweichen. D.h. alle 3 Prozesse laufen korrekt an, wissen aber welche die 1. 2. und 3. Instance ist. Wenn die 1. Instance ordentlich läuft senden die zwei nachfolgenden Prozesse ihre Parameter an die 1. Instance und terminieren. D.h. falls die 2 nachfolgenden Prozesse anhand der Semaphore bemerken das sie nicht die 1. Instance sind müssen die solange warten bis sie mit der 1. Instance kommunizieren können.
Allerdings, irgendwie verstehe ich dein Problem noch nicht so recht. Wenn ich mich richtig erinnere kann man den Registryschlüssel für ShellEx/Commmand so anlegen das der Explorer multiple Files an EINE Instance der Anwendung sendet. Er startet dann nur eine Instance und übergibt alle Files als Params.
Ansonsten, gibts noch den Weg über
COM Interfaces ein eigenes Shell-Interface zu programmieren. Statt dann über ParamStr() und ein EXE zu gehen, codet man eine
DLL als Handler. In dieser kann über die Shellextension direkt auf die ausgewählte Dateiliste im Explorer zugegriffen werden. Bei Delphi sind zwei Beispiel dafür vorhanden IShellContextMenu und IShellExecuteHook.
Gruß Hagen