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协议,使用灵活、速度快捷。