网站与win32可执行文件通信的标准方法是什么?

时间:2009-05-13 20:11:50

标签: delphi web-applications ipc

我有一些delphi代码,给定一个项目列表,计算总价格,考虑可能适用的任何特殊交易。

这段代码用另一种语言重写是非常重要的。

如何将其设置为与在同一服务器上运行的网站进行通信?每次用户更新购物车时,网站都需要询问价格。可能会有多个并发请求。

delphi代码需要维护特殊交易的内存列表,并定期从数据库刷新。所以它不能简单地每次都执行,也不能像那样简单。

我不知道网站的内容是什么,甚至不知道它运行在哪个http服务器上,所以我只是在寻找想法或标准方法。

7 个答案:

答案 0 :(得分:3)

听起来win32应用已经作为Windows服务运行了。因此,如果您无法修改该服务,您将不得不处理它想要接受的任何方式并响应请求。这可以通过套接字或一些更高级别的通信协议,如Web服务。

你可以做几件事。编写一个知道如何与服务进行通信并使您的网站使用该程序集的程序集。或者,您可以构建一个知道如何与旧服务进行通信的填充服务,但是通过Web服务等更高级别的协议来公开通信。无论哪种方式都有利于隐藏易于调用的接口背后的并发,线程和通信问题,但后者将使每个人都能更轻松地与服务进行通信。

答案 1 :(得分:3)

如果您可以修改delphi应用程序以获取XML请求并通过TCP套接字响应XML答案(理想情况下使用HTTP协议),您将能够相对轻松地与大多数Web服务器框架进行互操作。但是如何进行这种集成的确切细节将取决于它所编写的语言/框架。

如果Web服务器在Windows上,您可以将delphi应用程序编译为可以返回XML或HTML的DLL,将参数作为URL或POST操作的一部分。关于为Web服务器制作Delphi DLL的一些细节are here

答案 2 :(得分:2)

现有系统运行的Web服务器或操作系统无关紧要。重要的是你想要你的代码运行。如果它是Windows,那么最简单的解决方案是使用WebBroker并编写自定义ISAPI应用程序,或使用SOAP来公开Web服务。如果你想编写像API这样的休息,可以使用第一种方法,如果你的web应用程序能够使用Web服务,则可以使用第二种方法。

另一个选项,如果您在IIS下的同一个框上运行,则创建一个COM / Automation对象,然后通过服务器端脚本(ASP)调用该对象。如果应用程序是ASP.NET应用程序,那么我将使用PRISM将代码移植到程序集中。

答案 3 :(得分:2)

我用一个非常复杂的工人赔偿计算器完成了这项工作。我使用RemObjects Sdk创建了一个Windows服务。计算以肥皂方法公开,几乎可以被任何东西访问。

没有必要在服务中使用RemObjects,但它更容易处理,因为它处理了很多底层管道。客户端不需要RemObjects,只需要能够调用soap方法。几乎任何编程语言都可以做到。

您还可以为IIS创建一个公开soap接口的isapi dll。如果不同服务器上的其他网站需要访问这些方法,这将非常有用。但是我在我的情况下通过在防火墙中打开一个端口来访问我的Windows服务来处理这个问题。

网上有很多例子。有几个开始阅读的地方是About.ComDr Bob

答案 4 :(得分:1)

将此应用程序撕成了Windows服务。编写将与您的Windows服务进行通信的Web服务。您应该花一些时间来设计Web服务,因为这个Web服务将成为您的一致界面,屏蔽旧的Delphi应用程序。因此,无论何时您想要编写Web应用程序,移动应用程序或任何您想象的内容,您都将拥有一个一致的界面 - XML Web Service。

答案 5 :(得分:1)

将Web应用程序与后台服务集成的一种流行方式是消息代理。

消息流将是:

  • Web应用程序向消息代理上的消息目标发送“计算请求”消息,其中包含所有需要的参数以及与计算请求匹配的相关ID和来自Delphi服务的响应

  • 一个(或者,在高可用性/负载平衡环境中更多)Delphi服务处理消息:拉出下一个传入消息,通过将参数提供给计算引擎来处理它,并发送“计算结果消息“回到网络服务器

  • Web服务器可以同步等待响应(并丢弃没有匹配关联ide的响应)并构建结果HTML文档,或继续执行其他任务并在单独的线程中异步接收计算结果,例如,在基于Ajax的Web应用程序中

有关Dopplr图像服务的幻灯片,请参阅介绍:

http://de.slideshare.net/carsonified/dopplr-its-made-of-messages-matt-biddulph-presentation

made of messages by matt biddulph

答案 6 :(得分:0)

如果你可以把它变成一个服务(但不是一个库),你必须以某种方式进行进程间通信 - 在Windows上有几种方法可以做到这一点:

  • 直接插座,因为你必须自己进行编组/认证,这是最难的
  • 共享记忆(哎呀!)
  • RPC工作得很好但不是很简单
  • DCOM更容易但配置难以理解
  • WCF - 但您可以从用Delphi编写的Windows服务中调用它吗?