sitest.pp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. program SITest;
  2. {$mode objfpc}
  3. {$h+}
  4. uses
  5. Classes,
  6. CustApp, advancedipc, singleinstance;
  7. type
  8. TMyCustomApplication = class(TCustomApplication)
  9. private
  10. procedure ServerReceivedParams(Sender: TBaseSingleInstance; aParams: TStringList);
  11. procedure ServerReceivedCustomRequest(Sender: TBaseSingleInstance; {%H-}MsgID: Integer; aMsgType: TMessageType; MsgData: TStream);
  12. end;
  13. const
  14. MsgType_Request_No_Response = 1;
  15. MsgType_Request_With_Response = 2;
  16. MsgType_Response = 3;
  17. { TMyCustomApplication }
  18. procedure TMyCustomApplication.ServerReceivedCustomRequest(
  19. Sender: TBaseSingleInstance; MsgID: Integer; aMsgType: TMessageType;
  20. MsgData: TStream);
  21. var
  22. xData: string;
  23. xStringStream: TStringStream;
  24. begin
  25. MsgData.Position := 0;
  26. SetLength(xData, MsgData.Size div SizeOf(Char));
  27. if MsgData.Size > 0 then
  28. MsgData.ReadBuffer(xData[1], MsgData.Size);
  29. WriteLn('Request: ', xData);
  30. if aMsgType = MsgType_Request_With_Response then
  31. begin
  32. WriteLn('Sending response to client.');
  33. xStringStream := TStringStream.Create('my response');
  34. try
  35. (Sender as TAdvancedSingleInstance).ServerPostCustomResponse(MsgID, MsgType_Response, xStringStream);
  36. finally
  37. xStringStream.Free;
  38. end;
  39. end;
  40. end;
  41. procedure TMyCustomApplication.ServerReceivedParams(Sender: TBaseSingleInstance;
  42. aParams: TStringList);
  43. var
  44. I: Integer;
  45. begin
  46. Writeln('-----');
  47. Writeln('Params:');
  48. for I := 0 to aParams.Count-1 do
  49. Writeln(aParams[I]);
  50. Writeln('-----');
  51. end;
  52. var
  53. xApp: TMyCustomApplication;
  54. xStream: TStringStream;
  55. xMsgType: TMessageType;
  56. begin
  57. xApp := TMyCustomApplication.Create(nil);
  58. try
  59. xApp.SingleInstanceEnabled := True;
  60. xApp.SingleInstance.OnServerReceivedParams := @xApp.ServerReceivedParams;
  61. (xApp.SingleInstance as TAdvancedSingleInstance).OnServerReceivedCustomRequest := @xApp.ServerReceivedCustomRequest;
  62. xApp.Initialize;
  63. Writeln(xApp.SingleInstance.StartResult);
  64. xApp.Run;
  65. case xApp.SingleInstance.StartResult of
  66. siNotResponding: ReadLn;
  67. siClient:
  68. begin
  69. xStream := TStringStream.Create('hello');
  70. try
  71. (xApp.SingleInstance as TAdvancedSingleInstance).ClientSendCustomRequest(MsgType_Request_No_Response, xStream);
  72. finally
  73. xStream.Free;
  74. end;
  75. xStream := TStringStream.Create('I want a response');
  76. try
  77. (xApp.SingleInstance as TAdvancedSingleInstance).ClientSendCustomRequest(MsgType_Request_With_Response, xStream);
  78. xStream.Size := 0;
  79. if (xApp.SingleInstance as TAdvancedSingleInstance).ClientPeekCustomResponse(xStream, xMsgType) then
  80. WriteLn('Response: ', xStream.DataString)
  81. else
  82. WriteLn('Error: no response');
  83. finally
  84. xStream.Free;
  85. end;
  86. ReadLn;
  87. end;
  88. end;
  89. finally
  90. xApp.Free;
  91. end;
  92. end.