| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | program SITest;{$mode objfpc}{$h+}uses  Classes,  CustApp, advancedipc, singleinstance;type  TMyCustomApplication = class(TCustomApplication)  private    procedure ServerReceivedParams(Sender: TBaseSingleInstance; aParams: TStringList);    procedure ServerReceivedCustomRequest(Sender: TBaseSingleInstance; {%H-}MsgID: Integer; aMsgType: TMessageType; MsgData: TStream);  end;const  MsgType_Request_No_Response = 1;  MsgType_Request_With_Response = 2;  MsgType_Response = 3;{ TMyCustomApplication }procedure TMyCustomApplication.ServerReceivedCustomRequest(  Sender: TBaseSingleInstance; MsgID: Integer; aMsgType: TMessageType;  MsgData: TStream);var  xData: string;  xStringStream: TStringStream;begin  MsgData.Position := 0;  SetLength(xData, MsgData.Size div SizeOf(Char));  if MsgData.Size > 0 then    MsgData.ReadBuffer(xData[1], MsgData.Size);  WriteLn('Request: ', xData);  if aMsgType = MsgType_Request_With_Response then  begin    WriteLn('Sending response to client.');    xStringStream := TStringStream.Create('my response');    try      (Sender as TAdvancedSingleInstance).ServerPostCustomResponse(MsgID, MsgType_Response, xStringStream);    finally      xStringStream.Free;    end;  end;end;procedure TMyCustomApplication.ServerReceivedParams(Sender: TBaseSingleInstance;  aParams: TStringList);var  I: Integer;begin  Writeln('-----');  Writeln('Params:');  for I := 0 to aParams.Count-1 do    Writeln(aParams[I]);  Writeln('-----');end;var  xApp: TMyCustomApplication;  xStream: TStringStream;  xMsgType: TMessageType;begin  xApp := TMyCustomApplication.Create(nil);  try    xApp.SingleInstanceEnabled := True;    xApp.SingleInstance.OnServerReceivedParams := @xApp.ServerReceivedParams;    (xApp.SingleInstance as TAdvancedSingleInstance).OnServerReceivedCustomRequest := @xApp.ServerReceivedCustomRequest;    xApp.Initialize;    Writeln(xApp.SingleInstance.StartResult);    xApp.Run;    case xApp.SingleInstance.StartResult of      siNotResponding: ReadLn;      siClient:      begin        xStream := TStringStream.Create('hello');        try          (xApp.SingleInstance as TAdvancedSingleInstance).ClientSendCustomRequest(MsgType_Request_No_Response, xStream);        finally          xStream.Free;        end;        xStream := TStringStream.Create('I want a response');        try          (xApp.SingleInstance as TAdvancedSingleInstance).ClientSendCustomRequest(MsgType_Request_With_Response, xStream);          xStream.Size := 0;          if (xApp.SingleInstance as TAdvancedSingleInstance).ClientPeekCustomResponse(xStream, xMsgType) then            WriteLn('Response: ', xStream.DataString)          else            WriteLn('Error: no response');        finally          xStream.Free;        end;        ReadLn;      end;    end;  finally    xApp.Free;  end;end.
 |