在delphi中启动dll的多个进程

时间:2010-04-15 11:07:52

标签: delphi dll activex

我有一个用Delphi 2007创建的“ActiveX库”项目。库接口根据输入值返回XML数据。然后由PHP脚本使用它来显示网页上的数据。这很棒!

问题是我只能在服务器上运行一个dll进程实例。但是,出于安全原因,我的每个客户都应该能够访问他们自己的dll进程(因为dll始终只连接到一个数据库)。

另外,由于构建delphi代码的方式,它不支持多个线程。 (这是一个使用大量单身类的10万多行项目)

有没有办法启动同一个dll的多个实例?有没有更好的方法将XML数据从delphi传输到PHP?

对于这个冗长的问题感到抱歉,感谢任何帮助

(ps。我知道delphi代码应该重构,但这意味着6个月的“循环引用”-hell:)

2 个答案:

答案 0 :(得分:1)

您可以模拟CGI,甚至可以使用CGI。基本上,您需要一台服务器来监视传入的请求,并为每个新用户创建一个会话。然后每个会话启动一个加载DLL的新进程。该过程只是相关DLL的沙箱。

所以你有以下几个部分:

  1. 服务器(HTTP,TPC,SOAP等......)
  2. 客户端沙盒进程
  3. 您的DLL
  4. 客户端进程只是一个虚拟进程,其唯一目的是加载DLL并充当DLL和服务器之间的通信桥。使用IPC(进程间通信)委派服务器(会话)与持有DLL的沙盒进程之间的通信。这样,您就可以为每个客户分离流程,从而提高系统稳定性。一个DLL的失败不是整个系统的失败。

    现在许多系统以这种方式工作:

    1. CGI
    2. Google Chrome
    3. 最新的IIS和Apache ISAPI ...
    4. 请小心设置会话限制,否则可能会产生许多进程,导致主机操作系统关闭。有关过程限制的参考,请阅读Mark Russinovich撰写的精彩博文:

      Pushing the Limits of Windows: Processes and Threads

答案 1 :(得分:0)

我认为解决这个问题的唯一方法是在delphi部分和php部分之间放置某种中间件,它将收集请求,将它们放入队列并使用delphi代码逐个处理它们。也许你可以重构php部分以异步显示数据 - 这样php进程可以快速返回并向用户显示某种“正在加载...请等待”的消息,之后,由ajax继续尝试检索数据直到它可以从中间件获得(例如,php脚本可以将请求与session_id一起放在数据库表中,并且中间件部分可以逐个处理来自该表的每个请求,将检索到的数据写回到表中。 ,ajax请求可以继续查询表,直到数据可用为止。