I will show the simple IPC example in this post using the generic implementation. The IPC consist of two parts:
- Server(s) sharing the data;
- Client(s) reading the data.
Use this at your own risk. If you don’t like it – don’t use it. Mainly for demonstration purpose. No guarantees.
Server
Imagine we want to share the certain data with other applications. Let’s declare the record type for that like following:
type TIPCSharedData = packed record Int: Integer; Float: Double; Text: ShortString; end;
To create the server and share the data we need to write the following code:
uses uFunctions.IPC; const SERVER_ID: '{23559359-c028-41cb-a33d-450097a602d8}'; var LServer: IIPCAsyncDataServer<TIPCSharedData>; LData: TIPCSharedData; begin LData.Int := 10; LData.Float := 0.5; LData.Text := 'Hello!'; LServer := TIPCAsyncDataServer<TIPCSharedData>.Create(SERVER_ID); LServer.Data := LData; ... end;
If you create multiple servers with the same ID then clients will read the data of the server which wrote the data last. Also take a note that you can only use the non-managed types for data interchange (so no String, Interface, dynamic array etc).
Client
Now in other application to access the shared data we need to use the following construction:
uses uFunctions.IPC; const SERVER_ID: '{23559359-c028-41cb-a33d-450097a602d8}'; var LClient: IIPCAsyncDataClient<TIPCSharedData>; LData: TIPCSharedData; begin LClient := TIPCAsyncDataClient<TIPCSharedData>.Create(SERVER_ID); if LClient.ReadData(LData) then Writeln(LData.Text); ... end;
Enjoy!
Neat! I tried it and it works. Is it thread safe? Thanks!
LikeLike