我们有一个正在运行的Windows服务,我们也有一个控制台应用程序用于配置此服务,我们也有一个选项可以查看正在记录的某些日志。控制台应用程序与Windows服务进行通信
与此非常丑陋的事情是,这种沟通是由文本文件,控制台应用程序写入文本文件和服务读取它,反之亦然。
你会用什么来进行这种交流? TCP/IP不是一个选项,因为控制台应用程序仅用于本地运行服务。
Windows API SendMessage应该走的路吗?
谢谢!
我们有一个正在运行的Windows服务,我们也有一个控制台应用程序用于配置此服务,我们也有一个选项可以查看正在记录的某些日志。控制台应用程序与Windows服务进行通信
与此非常丑陋的事情是,这种沟通是由文本文件,控制台应用程序写入文本文件和服务读取它,反之亦然。
你会用什么来进行这种交流? TCP/IP不是一个选项,因为控制台应用程序仅用于本地运行服务。
Windows API SendMessage应该走的路吗?
谢谢!
如果使用.net作为它为此类事物构建并且相对容易使用,我会建议WCF首先考虑所有Windows上的通信。由于你不包括TCP,我建议使用Named Pipes Binding。
也有一些Windows通信apis可用于机内通信。 Named Pipes(如上所述),MailSlots,Shared Memory (Memory Mapped files)等
我的建议是使用命名管道与WCF或本机。
共享内存?有关Codeproject上的文章,请参阅here,这是另一个fastipc文章在同一网站上。有一篇博客文章详细介绍如何使用memory mapped file通过包装器共享。
希望这会有所帮助, 最好的问候, 汤姆。
如果使用消息传递的非阻塞方法,那么运行死锁的风险就会降低。 PostMessage
或SendNotifyMessage
比SendMessage
更好,因为它们不阻止呼叫者。
但他们依赖于具有窗口句柄的服务。可以?
您还可以使用WM_COPYDATA消息来传递不仅仅是一个wParam a lParam。如果您在PostMessage中使用此消息,则需要注意不要释放内存,直到接收器完成。对于WM_COPYDATA使用SendMessage是最安全的。
+1 - 我不确定OP用于编码的内容,但是我在过程之间使用WM_COPYDATA PostMessage来处理进程之间的通信。如果内存分配正确,则将其设置为让接收方在消息接收时释放该内存。这使它异步。 – ChrisBD 2010-01-29 09:57:15
请注意,由于会话0隔离,PostMessage方法在Vista上以及在某些情况下会失败 - 请参阅http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx – 2010-03-01 21:01:21