0

我有一个桌面应用程序和一项服务。如何将字符串从桌面应用程序发送到我的服务并在服务中处理它?

我不想使用套接字,因为它可能被 Windows 防火墙阻止。

4

1 回答 1

6

如果您不想使用网络传输,那么进行跨会话 IPC 的最简单方法可能是使用命名管道。需要注意的主要事情是在创建命名管道时需要提供安全属性。如果不这样做,您将无法在跨会话通信中取得成功。我这样做的代码如下所示:

var
  SA: TSecurityAttributes;
....
SA.nLength := SizeOf(SA);
SA.bInheritHandle := True;
ConvertStringSecurityDescriptorToSecurityDescriptor(
  'D:(A;OICI;GRGW;;;AU)',//discretionary ACL to allow read/write access for authenticated users
  SDDL_REVISION_1,
  SA.lpSecurityDescriptor,
  nil
);
FPipe := CreateNamedPipe(
  '\\.\pipe\MyPipeName',
  PIPE_ACCESS_DUPLEX,
  PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT,
  PIPE_UNLIMITED_INSTANCES,
  0,//don't care about buffer sizes, let system decide
  0,//don't care about buffer sizes, let system decide
  100,//timout (ms), used by clients, needs to cover the time between DisconnectNamedPipe and ConnectNamedPipe
  @SA
);
LocalFree(HLOCAL(SA.lpSecurityDescriptor));
if FPipe=ERROR_INVALID_HANDLE then begin
  ;//deal with error
end;
于 2013-04-18T10:48:50.833 回答