Der Punkt an RegisterWindowMessage ist doch, dass der gleiche String den gleichen Rückgabewert erzeugt. In beiden Programmen rufst du also RegisterWindowMessage('Meine Shellextension') auf und erhältst den gleichen Nachrichtencode.
Diese Nachricht kannst du nutzen, um aus deinem Zielprogramm ein
Handle an das Senderprogramm zu schicken, sodass das Senderprogramm wiederum WM_COPYDATA schicken kann.
Startest du eigentlich immer das Zielprogramm selbst? Dann kannst du doch gleich über die Kommandozeile gehen: Einfach direkt den String oder aber ein Fensterhandle bzw. Pipehandle übergeben. Man muss es sich ja nicht unnötig schwierig machen.
Edit: In der
DLL ist es natürlich etwas schwierig mit RegisterWindowMessage, da dafür ein Fenster und eine Nachrichtenschleife nötig sind. Mal wieder zu kurz gedacht.