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 作 者
Switf與OC混合開發流程
看著身邊越來越多的小夥伴轉入Swift,本人也跟隨潮流,轉戰Swift了~下面是初步寫入的一個Swift專案框架。 1.建立專案,這個應該不用說了,語言swift 2.CocoaPods 匯入第三方 3.那就開寫吧~~之前好像還得弄橋接檔案,不過,現在好像不需要了,我這麼
如玫瑰一般的PHP與C#混合程式設計
故事背景是這樣的,有一套專案,伺服器端是用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
android與H5混合開發
最近在左一個Android原生的H5混合開發的APP,之前還沒有好好的總結一下Android原生 和 H5 之間互動的方法,這裡來總結一下:1、hybrid通訊,主要就是前端的js和我們Android端的通訊 這是最基本JS和Java 的通訊方式: 這裡我
安卓與html混合開發之原生與js相互呼叫
原生和html的優缺點就不多說了,有些特定條件下用html頁面可以很方便,也很容易更新和維護,那麼這就涉及到html與安卓原生的互動和通訊。 接下來我要分享的是html呼叫原生的彈窗和位置資訊,安卓原生呼叫JS中的方法。 xml很簡單: <?xml version=
react native與Android混合開發
想要進行混合開發你需要一定的android基礎,廢話不多說,直接上圖: 在index.android.js 中註冊3個元件,分別為A、B、C,其中程式碼基本相同: 點選text控制元件調到下一個activity,跳轉activity需要原生的支援,我
Java與Kotlin混合開發中的問題
** Kotlin成為了Android的官方語言 於是後知後覺的開始在專案中引入kotlin,但是隻知其優點,不知其詳細則不可,於是加班加點的系統地學習了一下Kotlin之後,開始了專案的kotlin開發。 在專案中進行開發的時候,因為之前是java開
h5開發:IOS開發與H5混合開發常見的坑
最近做 iOS H5 專案,需要針對 iOS 的 webView 做適配,發現幾個非常噁心的 bug。 因為現在據統計 iOS7 的佔比超過80%,所以適配主要針對 iOS7,但是 iOS7 不同版本缺有不同的 bug,真是讓人蛋疼。 iOS 7.0 input 元素
STM32——C與C++混合開發
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混合開發-(Android與Web的互動)
在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