【问题标题】:Start multiple processes of a dll in delphidelphi启动一个dll的多个进程
【发布时间】:2011-02-08 08:05:01
【问题描述】:

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

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

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

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

抱歉,问题太长了,感谢您的帮助

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

【问题讨论】:

    标签: delphi dll activex


    【解决方案1】:

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

    所以你有以下部分:

    1. 服务器(HTTP、TPC、SOAP 等等...)
    2. 客户端沙盒进程
    3. 你的 DLL

    客户端进程只是一个虚拟进程,其唯一目的是加载 DLL 并充当 DLL 和服务器之间的通信桥梁。使用 IPC(进程间通信)来委派服务器(会话)和持有 DLL 的沙盒进程之间的通信。这样,您就可以为每个客户隔离流程,并获得系统稳定性。一个DLL的故障不是整个系统的故障。

    现在很多系统都是这样工作的:

    1. CGI
    2. 谷歌浏览器
    3. 最新的 IIS 和 Apache ISAPI ...

    请小心设置会话限制,否则可能会产生许多进程,从而导致主机操作系统停机。有关进程限制的参考,请阅读 Mark Russinovich 的精彩博客文章:

    Pushing the Limits of Windows: Processes and Threads

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-03-22
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        相关资源
        最近更新 更多