PHP 与 Delphi 混合开发 Web 程序

    需求:
    有一个桌面软件,需要通过机器码产生序列号,这个过程需要在一个网站后台完成。而产生序列号的代码是用 Delphi 编写的,此代码移植到 PHP 语言下有一定的困难,或者无法完成。于是产生了 PHP 调用 Delphi 代码的问题。

    解决方案及其优劣考虑:
    PHP 调用其它语言的代码,有几种方案:
    PHP 调用 C 代码,可以通过 PHP 扩展开发,生成 PHP 的 dll 扩展文件,在 php.ini 文件里加载,PHP 直接使用 dll 封装的函数。这种方案的优点是,与操作系统平台无关(跨平台),也能保证代码效率。但 PHP 扩展开发似乎只能用 C/C++ 开发,有语言限制,开发过程繁琐,也有一定的难度。

    还有一种方法,就是通过 Windows 的 COM 机制,实现进程间通信,从而达到异构语言的代码的间接共享,而且是一种二进制级别的共享。好在 PHP 语言支持 Windows 平台下的 COM 调用,完全可以解决这个问题。
    这种方法的好处是,只要某种语言能够完成 COM 开发,生成了二进制的 COM 组件,就能实现该需求。包括 C++、Delphi、C# 等语言,都能开发 COM 组件。
    这种方法的缺点是,不能跨平台,只能在 Windows 下实现。因为到目前为止,COM 机制只有 Windows 操作系统支持它。

    具体实现:
    用 Delphi7.0 实现。在 PHP4.4.7 下测试通过。
    用 Delphi 创建 ActiveX Library 工程(createkey.dpr),再建立 Automation Object 项目,会弹出接口向导,填写欲实现的接口名(Mycode)。
    确定后,接着进入类型库编辑器窗口(createkey.tlb),类型库编辑器会自动建立 COM 接口 IMycode 和组件类 Mycode。这个 COM 接口默认是个双(Dual)接口(接口(interface)和调度接口(dispinterface)),既能实现编译时的早绑定,也提供了自动化COM对象在被调用时的晚绑定。并且因为是 COM 的扩展 - 自动化应用,所以对象的接口编组等工作不用我们程序员考虑了。
    编辑和刷新类型库后,同时生成对应的 Delphi 代码(createkey_TLB.pas文件),和其二进制版本 createkey.tlb。

    本组件的方法和属性:
    方法:
      cumput(nIn: SYSINT)
    属性:
      sStr1[const s: WideString]: WideString,只读
      nNum: Integer,可读写

    我们需要做的,就是在 Delphi 自动生成的另一个单元文件里,对 IMycode 接口里的方法和属性进行编码实现。

    createkey_TLB.pas 文件核心代码:

    IMycode = interface;
    IMycodeDisp = dispinterface;
    Mycode = IMycode;

    IMycode = interface(IDispatch)
      ['{1F646769-B93**588-B107-C853F5331512}']
      function Get_sStr1(const s: WideString): WideString; safecall;
      procedure cumput(nIn: SYSINT); safecall;
      function Get_nNum: Integer; safecall;
      procedure Set_nNum(Value: Integer); safecall;
      property sStr1[const s: WideString]: WideString read Get_sStr1;
      property nNum: Integer read Get_nNum write Set_nNum;
    end;

    IMycodeDisp = dispinterface
      ['{1F646769-B93**588-B107-C853F5331512}']
      property sStr1[const s: WideString]: WideString readonly dispid 202;
      procedure cumput(nIn: SYSINT); dispid 201;
      property nNum: Integer dispid 203;
    end;

    示例代码下载:http://blog.why100000.com/wp-content/uploads/2010/06/com_auto.rar

    测试:

    Bulid 该工程,生成 createkey.dll 文件,然后用 regsvr32.exe 注册。
    PHP 调用示例代码:
    <?php
      echo 'COM test:<br>';
      $objCom = new COM("createkey.Mycode");
      echo $objCom->sStr1('from php') .'<br>';
      $objCom->nNum = 7;
      $objCom->cumput(1);
      echo $objCom->nNum .'<br>';
      echo 'Over';
      //释放对象
      $objCom = null;
    ?>

    作者:张庆(网眼) 西安 PHP 教育培训中心 2010-6-18
    来自“网眼视界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十万个为什么”电脑学习网:http://www.why100000.com

使用视觉化RAD 整合开发环境元件架构进行CodeGear 创新的 PHP开发    S COTTS VALLEY, Calif.–2007年2月20日–-CodeGear,作为开发者工具领导者, 发布了Delphi for PHP, 这是一个基于元件的快速应用程式开发(RAD)IDE, 同时还发布VCL for PHP,这是一个开放原始程式码的可视元件库。 Delphi for PHPPHPWeb开发者带来了Delphi用户已经享受多年 的RAD生产力。 PHP是当今的最富盛名的动态Web语言,是10大程式设计语言之一。 Delphi for PHP使PHP能够更快且更轻松的开发丰富的资料库驱动的Web应 用程式,使其达到更高水准。    位于加拿大安大略省的一家 开发者工具公司-JomiTech的所有者 Jonath an Benedicto认为:“CodeGear开发工具是市场上最好的工具, Delphi for PHP也是如此。”Benedicto说道: “作为长期PHP的开发者, 我第一时间采用了Delphi for PHP作为我最喜爱的编辑器。VCL for PHP 具有我们所熟悉的Delphi设计,并提供了大量的面向RAD能力。如今, 我可以使用经整合的页面范本功能, 轻松地从实际网页逻辑代码中减弱GUI。Delphi for PHP真正实现了将PHP 开发引领到更高水准。”    CodeGear产品策略部副总裁Michael Swi ndell说道:“在创建动态Web应用程式时, PHP开发者已经拥有原始程式码编辑和调试工具; 而PHP真正缺少的是快速开发工具和能够现代工具相抗衡的元件架构, 比如Visual StudioR 和Delphi以及类似于ASP.NET 和VCL的架 构。”    Swindell说道: “Delphi for PHP提供了快速和视觉化创建强大的PHP应用程式的能力, 新的PHP元件以及打包现有PHP代码到可重复使用的视觉化元件所需要的特性和功能性 。Delphi for PHP通过无缝支持MySQLR, InterBaseR from CodeGear, 以及其他SQL资料库实现对所有这些的支持, 并通过开源VCL for PHP得以实现。MicrosoftR WindowsR RAD 开发者现在已经可以享受Delphi 和 C++BuilderR所提供的熟练性和易用性 ,可以迅速而自信地移入PHP开发。” Delphi for PHP所包含的重要特性: 适用于PHP的RAD环境 1. VCL for PHP – 基于开源PHP 5版本而开发的可视元件 库,拥有超过50个可延展和可复用的组件, 以及无缝AJAX整合 2. InterBase, MySQL, Oracle, Microsoft SQL Server以及其他常用资料库的开盒即用的资料库整合 3. 经整 合的PHP调试工具 4. 在Windows,Linux, Solaris 以及其他平台上的PHP应用程式的分发 5. 对各种应用程式的国际化支援 6. 使用 Data Explorer for InterBase和 MySQL, 拖拉资料库应用程式开发 7. Code editor with 使用Code Insight, Code Explorer,以及 Code Templates的代码编辑器, 使写入PHP代码更加轻松和快捷
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值