Python源码另类隐藏——P4D
如果需要对python源文件加密似乎没什么好方法,编译成pyo/pyc也容易被反编译。在使用p4d的时候,发现一个另类的办法,将python源文件作为资源文件打包到EXE中,运行时动态加载,不产生文件,保密性稍好一点。
P4D
P4D(Python for Delphi)可以让delphi和python结合起来工作,delphi做桌面应用高效快捷,python有丰富的内裤,在网络处理方面有优势,结合起来非常强大。还可以随时修改python脚本来维护。
相关资源:
http://www.atug.com/andypatterns/pythonDelphiTalk.htm
http://code.google.com/p/python4delphi/
http://tech.groups.yahoo.com/group/pythonfordelphi/
Delphi调用Python
一.需要安装delphi、python、p4d
我只找到适用于python2.5的p4d,而本机安装的python27,按照设置方法设置后仍有错误,不想在本机上降级python就在虚拟机上安装了个环境。
网上的办法是在dephi中使用TPythonEngine时,设置TPythonEngine的属性:
DllName : python27.dll
RegVersion : 2.7
DllPath : c:\windows\system32\
UseLastknownVersion : false
二.编写python脚本并生成delphi的资源文件
1.python脚本
文件名:file1.py
print "Hello, P4D"
2.生成资源文件
新建一个文本文档,输入以下内容并保存为"file1.rc"文件
file1 FILE file1.py
需要delphi程序的bin目录下的brcc32.exe文件,使用它从file1.rc生成"file1.res"资源文件。
将file1.py和file1.rc文件放在同一目录下,使用命令提示符完成以下操作:
brcc32.exe file1.rc
则会在file1.py和file1.rc目录下生成file1.res。
更简单直接的方法是,将brcc32.exe复制到上述目录中,直接把file1.rc拖到brcc32.exe上,DONE!
说明:
file1.rc文件中的三个参数依次为:{资源名称} {资源类型} {资源文件}
资源名称即在delphi中调用的资源名字;
资源类型通常有:
FILE: 一般文件
RCDATA:二进制文件;
AVI: AVI动画;
ICON: 图标;
BITMAP:位图;
CURSOR:光标文件;
EXEFILE: exe文件
WAVE:声音文件;资源文件就是要打包成资源的文件实体。
三.在delphi中使用资源文件
将上面生成的资源文件file1.res放在delphi的工程目录下,在工程中加上编译指令{$R file1.res}
{$R file1.res}
在需要使用资源时提取出来(python脚本内容存到TStrings中而不生成文件):
function ExtractRes(resType, resName: String; pyStrings: TStrings): Boolean; var res : TResourceStream; begin result := false; try res := TResourceStream.Create(HInstance, resName, Pchar(resType)); pyStrings.LoadFromStream(res); result := true; finally res.free; end; end;
调用:
procedure TForm1.Button2Click(Sender: TObject); var pyStrings: TStrings; begin pyStrings:= TStringList.Create; if ExtractRes('FILE', 'file1', pyStrings) then PythonEngine1.ExecStrings( pyStrings ) else showmessage('Error on ExtractRes'); end;
* delphi代码(包括了一个直接执行python语句的功能)
文件名:Unit1.pas
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, PythonEngine, PythonGUIInputOutput, StdCtrls, WrapDelphi; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Memo2: TMemo; PythonGUIInputOutput1: TPythonGUIInputOutput; Button2: TButton; PythonEngine1: TPythonEngine; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {$R file1.res} //资源文件 //提取资源,pyStrings为返回 function ExtractRes(resType, resName: String; pyStrings: TStrings): Boolean; var res : TResourceStream; begin result := false; try res := TResourceStream.Create(HInstance, resName, Pchar(resType)); pyStrings.LoadFromStream(res); result := true; finally res.free; end; end; //直接执行Memo1中的语句 procedure TForm1.Button1Click(Sender: TObject); begin PythonEngine1.ExecStrings( Memo1.Lines ); end; //提取资源并执行 procedure TForm1.Button2Click(Sender: TObject); var pyStrings: TStrings; begin pyStrings:= TStringList.Create; if ExtractRes('FILE', 'file1', pyStrings) then PythonEngine1.ExecStrings( pyStrings ) else showmessage('Error on ExtractRes'); end; end.
注:需要加入TPythonGUIInputOutput和TPythonEngine控件,安装P4D后可以python标签下看到。
源码下载:http://download.csdn.net/detail/mrqyoung/4799327
附:使用了P4D的delphi程序分发
分发时需要放入python对应版本的dll文件和使用到的lib,放在EXE同目录。
如使用的p4d对应python2.5 ,在python脚本中有“import md5”则:
在exe的目录中放入“python25.dll”、建立Lib目录并将“md5.py”放入Lib
--EOF--
posted on 2012-11-22 21:10 Mr.Q.Young 阅读(893) 评论(0) 编辑 收藏 举报