2010-01-29 190 views
5

我们有一个正在运行的Windows服务,我们也有一个控制台应用程序用于配置此服务,我们也有一个选项可以查看正在记录的某些日志。控制台应用程序与Windows服务进行通信

与此非常丑陋的事情是,这种沟通是由文本文件,控制台应用程序写入文本文件和服务读取它,反之亦然。

你会用什么来进行这种交流? TCP/IP不是一个选项,因为控制台应用程序仅用于本地运行服务。

Windows API SendMessage应该走的路吗?

谢谢!

回答

6

如果使用.net作为它为此类事物构建并且相对容易使用,我会建议WCF首先考虑所有Windows上的通信。由于你不包括TCP,我建议使用Named Pipes Binding

也有一些Windows通信apis可用于机内通信。 Named Pipes(如上所述),MailSlots,Shared Memory (Memory Mapped files)

我的建议是使用命名管道与WCF或本机。

0

共享内存?有关Codeproject上的文章,请参阅here,这是另一个fastipc文章在同一网站上。有一篇博客文章详细介绍如何使用memory mapped file通过包装器共享。

希望这会有所帮助, 最好的问候, 汤姆。

1

如果使用消息传递的非阻塞方法,那么运行死锁的风险就会降低。 PostMessageSendNotifyMessageSendMessage更好,因为它们不阻止呼叫者。

但他们依赖于具有窗口句柄的服务。可以?

您还可以使用WM_COPYDATA消息来传递不仅仅是一个wParam a lParam。如果您在PostMessage中使用此消息,则需要注意不要释放内存,直到接收器完成。对于WM_COPYDATA使用SendMessage是最安全的。

+0

+1 - 我不确定OP用于编码的内容,但是我在过程之间使用WM_COPYDATA PostMessage来处理进程之间的通信。如果内存分配正确,则将其设置为让接收方在消息接收时释放该内存。这使它异步。 – ChrisBD 2010-01-29 09:57:15

+0

请注意,由于会话0隔离,PostMessage方法在Vista上以及在某些情况下会失败 - 请参阅http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx – 2010-03-01 21:01:21

相关问题