Was out for most of the morning and just had a chance to review the source. Yeah, so TSimpleIPCClient just uses standard API calls on Windows but it has some hardcoded assumptions that make having it communicate cross-language a little annoying.
Namely it connects through this procedure:
procedure TWinMsgClientComm.Connect;
begin
FHWND:=FindWindow(MsgWndClassName,PChar(FWindowName));
If (FHWND=0) then
Owner.DoError(SErrServerNotActive,[Owner.ServerID]);
end;
You see FindWindow only has two parameters: The Window Class and the Window Name. The window name is easy to modify in any language, including C#. However, the Window Class is hard to modify in many languages. From reading elsewhere, I believe the Window Name ends up corresponding to the TSimpleIPCClient.ServerID. However there is no corresponding property for the Window Class. It is hardcoded in simpleipc.inc as:
Const
MsgWndClassName : pchar = 'FPCMsgWindowCls';
So most of the challenge is coding a window in another language with a custom class name which is then set to 'FPCMsgWindowCls'.
Really, it sort of almost makes more sense long term to change the SimpleIPCClient to add a new property for 'LanguageID' or something and set it to FPCMsgWindowCls by default, so it can be more easily adapted to talking to other languages.