1. 程式人生 > >PHP 與 Delphi 混合開發 Web 程式

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-B936-4588-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-B936-4588-B107-C853F5331512}']
      property sStr1[const s: WideString]: WideString readonly dispid 202;
      procedure cumput(nIn: SYSINT); dispid 201;
      property nNum: Integer dispid 203;
    end;

    測試:

    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 Delphi 混合開發 Web 程式

    需求:    有一個桌面軟體,需要通過機器碼產生序列號,這個過程需要在一個網站後臺完成。而產生序列號的程式碼是用 Delphi 編寫的,此程式碼移植到 PHP 語言下有一定的困難,或者無法完成。於是產生了 PHP 呼叫 Delphi 程式碼的問題。     解決方案及

利用CEFSharp在WPF中顯示網頁(可實現PC端的混合開發,Web硬體互動)

最近遇見Web應用需要呼叫身份證讀卡器等硬體介面,按照一般解決辦法封裝一個OCX控制元件就完事了。但是問題就出現了,目前只有IE支援ActiveX控制元件,IE載入控制元件還需要點“允許”等等。由於本人比較抵觸IE的,所以看這樣的實現方式怎麼都是不爽就對了(我想很多人都是這樣

032_《Delphi下用Intraweb開發WEB程式應用實戰(第二版)》

《Delphi下用Intraweb開發WEB程式應用實戰第二版》 Delphi 教程系列書籍 (032) 《Delphi下用Intraweb開發WEB程式應用實戰第二版》網友(邦)整理 EMail: [email protected] 下載地址: Pdf 作 者

SwitfOC混合開發流程

看著身邊越來越多的小夥伴轉入Swift,本人也跟隨潮流,轉戰Swift了~下面是初步寫入的一個Swift專案框架。  1.建立專案,這個應該不用說了,語言swift   2.CocoaPods 匯入第三方 3.那就開寫吧~~之前好像還得弄橋接檔案,不過,現在好像不需要了,我這麼

如玫瑰一般的PHPC#混合程式設計

故事背景是這樣的,有一套專案,伺服器端是用C#寫的,為了完成某種事情,它需要使用到一個元件,這個元件很小但很重要,很不巧的是,這個這個元件是用PHP語言寫的,如果為了使用這個元件而專門搭建一個PHP的環境顯得有點高射炮打蚊子(況且還有其他不可預見的阻力)。或許有讀者會提出“抗議”:不是PHP寫的麼,直接看原始

vertex 3.0 SpringBoot混合開發之初探

SpringBoot是最近幾年比較流行的web應用開發框架,它是微服務的一個開發框架。它的Web伺服器核心為Tomcat或Jetty,它們作為Servlet容量來對客戶端的http/https請求進行解析。最近,spring.io又出推出一套新的伺服器核心框架,它就是WebFlux,以流(stream)的方式

eclipse載入jdbc驅動開發web程式(mac電腦)

今天給大家介紹一下mac電腦的eclipse如何載入jdbc驅動,我使用的是mysql資料庫(mac版本mysql比較好安裝),首先需要準備jdbc驅動,可以在https://dev.mysql.com/downloads/connector/j/進行下載,注意:進入頁面是 我們可以看到,

node開發web程式---04構建node web程式

HTTP 伺服器的基礎知識 var http=require('http'); http.createServer("/",function(req,res){ res.end("hello"); }).listen(3000); console.log("start server") 複製程式碼

OC Swift混合開發之相互呼叫

首先在專案中,為了保障工作的穩定性(工作不好找),使用混合式開發室最好的選擇(前提是自己能夠看得懂自己寫的程式碼)。廢話一小段……. 一、首先說一下呼叫的問題:OC->Swift(OC呼叫Swift) 首先配置一下環境:如圖 1、Build Se

androidH5混合開發

最近在左一個Android原生的H5混合開發的APP,之前還沒有好好的總結一下Android原生 和 H5 之間互動的方法,這裡來總結一下:1、hybrid通訊,主要就是前端的js和我們Android端的通訊     這是最基本JS和Java 的通訊方式:       這裡我

安卓html混合開發之原生js相互呼叫

原生和html的優缺點就不多說了,有些特定條件下用html頁面可以很方便,也很容易更新和維護,那麼這就涉及到html與安卓原生的互動和通訊。 接下來我要分享的是html呼叫原生的彈窗和位置資訊,安卓原生呼叫JS中的方法。 xml很簡單: <?xml version=

react nativeAndroid混合開發

想要進行混合開發你需要一定的android基礎,廢話不多說,直接上圖: 在index.android.js 中註冊3個元件,分別為A、B、C,其中程式碼基本相同: 點選text控制元件調到下一個activity,跳轉activity需要原生的支援,我

JavaKotlin混合開發中的問題

** Kotlin成為了Android的官方語言 於是後知後覺的開始在專案中引入kotlin,但是隻知其優點,不知其詳細則不可,於是加班加點的系統地學習了一下Kotlin之後,開始了專案的kotlin開發。 在專案中進行開發的時候,因為之前是java開

h5開發:IOS開發H5混合開發常見的坑

最近做 iOS H5 專案,需要針對 iOS 的 webView 做適配,發現幾個非常噁心的 bug。 因為現在據統計 iOS7 的佔比超過80%,所以適配主要針對 iOS7,但是 iOS7 不同版本缺有不同的 bug,真是讓人蛋疼。 iOS 7.0 input 元素

STM32——CC++混合開發

keil中支援混合編譯C和C++程式。 在混合編譯時,需要注意以下幾點: 1、C副檔名必須為.C, C++副檔名必須為.CPP, 標頭檔案副檔名必須為.CPP。 如果原始檔的副檔名使用錯誤,會導致編譯出錯。 注:字尾名非必須為.CPP字尾名,也可以.C,但

乾貨:PHP大資料開發實踐

    大資料是使用工具和技術處理大量和複雜資料集合的術語。能夠處理大量資料的技術稱為MapReduce。         很多初學者,對大資料的概念都是模糊不清的,大資料是什麼,能做什麼,學的時候,該按照什麼線路去學習,學完往哪方面發

flutter android 混合開發

現有的混合開發方式,都是存flutter專案在android系統或者iOS上面跑。 但是,實際情況是,我們需要在一個成熟的native專案上面,跑幾個flutter頁面,逐步的進行flutter的融合,並且看情況來進行是否取代native的頁面。 以下都是基於flutter version:Flutter 1

Android混合開發-(AndroidWeb的互動)

在Android開發中,越來越多的商業專案使用了Android原生控制元件與WebView進行混合開發,當然不僅僅就是顯示一個WebView那麼簡單,有時候還需要本地Java程式碼與HTML中的JavaScript進行互動,Android也對互動做了很好的封裝,所以很容易實現例如:點選網頁中的按鈕A

服務計算——web程式開發Go原始碼

原始碼:https://github.com/kotomineshiki/WebServerOfGo 處理 web 程式的輸入與輸出 要求: 支援靜態檔案服務 支援簡單 js 訪問 提交表單,並輸出一個表格 對 /unknown 給出開發中的提示,返回碼 5

QT Web本地應用的混合開發

本文介紹了在Qt中如何開發Web本地混合應用,以及如何讓js與c++雙向呼叫。附帶幾個簡單例項。 接觸Qt也就兩個星期多吧,所以文章中難免有幼稚和錯誤的地方,請各位不吝賜教。 個人認為標記語言描述的介面是介面開發的一個發展趨勢。WPF、Java FX,當然也少不了Ht