1,緣起
某個項目需要實現數據加密上傳,主程序擬采用delphi7實現,其中的數據加密采用RSA,Cipher_pkcs1_v1_5加密。
該加密在python中容易實現,且已經有現成的加密函數。
如果在delphi中重新實現該算法,由於無現成的庫可用,需要自己編寫,比較麻煩且結果不一定正確。
因此,delphi程序如何能借用已有的python算法成為一個現實問題。
2,思路
首先,python源碼在現場運行不現實,因為在現場電腦上安裝python運行環境會面臨不確定性。因此,首先否定運行python源碼的想法。
其次,采用 python4delphi?感覺不好,存在隱患:涉及Python版本、P4D版本,Python依賴庫、unicode等。對當前delphi IDE環境也有破壞。
再次,既然不能運行python源碼,那么能否將python源碼編譯為exe程序呢?答案是肯定的,采用pyinstaller就行。
因此,確定架構為delphi EXE程序(以下簡稱DE程序)調用Python EXE程序(以下簡稱PE程序)
3,DE與PE的調用方式
那么DE程序如何調用PE程序呢?
很明顯的一種方式是 DE采用winExec函數,調用PE,傳入待加密字符串,返回加密結果
但此法的缺點很明顯,如
每次加密均需調用運行釋放PE一次,耗費時間
不能同步返回結果,winExec啟動PE程序后就返回,DE程序需要循環判斷PE程序釋放執行完成
最關鍵的一點,winExec不能返回PE程序退出時的返回值
因此,很自然地想到采用UDP通信方式。好處也是顯而易見的,
調用關系明確,DE啟動時自動啟動PE,DE退出時自動關閉PE
同步調用,響應及時。IdUDPClient1.Send后,IdUDPClient1.ReceiveString會阻塞,直到結果返回。
4,demo運行
下圖中server.exe來源於server.py代碼,由pyinstaller編譯為windows EXE文件。
delphi程序請求加密,server.exe收到數據后將其加密后返回,delphi程序將密文顯示在右側列表框。
5,總結
混合編程可以發揮多種語言的優勢。已有的功能不妨多包裝借用,省時省力且質量有保障。
多程序間數據交換盡可能采用UDP、TCP協議,使用靈活、速度快捷。