• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi脚本语言注入

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Delphi不是解释性语言,在很多需要动态维护代码的时候很难处理,自己写一个解释器也不是现有的精力和能力可以完成的,好在Microsoft提供了一个ActiveX组件TScriptControl。这个组件可以完成简单的脚本操作,对VBScript和JavaScript都提供支持。在Delphi中将其加入即可像普通控件一样使用。

下面是一个VBScript的消息框示例:
以下内容为程序代码:

   ScriptControl1.Language:='VBScript';
   ScriptControl1.ExecuteStatement('MsgBox "Hello, World!"');

下面是一个JavaScript内嵌函数的示例:
以下内容为程序代码:

procedure TForm1.Button3Click(Sender: TObject);   
var  
   n:Integer;   
   Parameters:PSafeArray;   
   bound:TSAFEARRAYBOUND;   
   Index:integer;   
   v:Variant;   
begin  
   
//   
   
try  
     n:
=StrToInt(inputbox('demo','请输入要计算阶乘的数','));  
   except  
     ShowMessage(
'输入有误,必须输入数字,请重新运行');  
     Exit;  
   
end;  
   ScriptControl1.Reset;  
   ScriptControl1.Language:
='JScript';  
   
//添加阶乘函数  
   scriptcontrol1.addCode(
'function factorial(num){'+  
                  
'result=1;for(ix=1;ix<=num;ix++){'+  
                  
'result = result*ix;};return result;};');  
   
//参数为一维有一个元素的SafeArray  
   bound.lLbound:
=0;  
   bound.cElements:
=1;  
   
try  
     Parameters :
= SafeArrayCreate(VT_VARIANT, 1, bound);  
   
except  
     ShowMessage(
'分配内存错误');  
     Exit;  
   
end;  
   
//因为SafeArrayPutElement的第二个参数定义为const类型,  
   
//所以index必须定义为变量并赋值才能被调用  
   V:
=n;  
   Index:
=0;  
   SafeArrayPutElement(Parameters,Index,V);  
   
try  
     ShowMessage(ScriptControl1.Run(
'factorial',Parameters));   
   
finally  
     SafeArrayDestroy(Parameters);   
   
end;                                                         
end;  

 

下面是一个运行过程中动态加载脚本的示例:
以下内容为程序代码:

(*  
function myfunction(param){  
/*  
if (param == 9)  
result = '999';  
else  
result = '???';  
   return result;  
*/  
switch(param){  
     case 0:  
           result = '000';  
           break;  
     case 9:  
           result = 'OK';  
           break;  
     default:  
           result = param;  
};  
   return result;  
};  
*)  
procedure TForm1.Button4Click(Sender: TObject);   
var  
   szCode, szCodeTmp, szFunName: 
string;   
   Parameters:PSafeArray;   
   bound:TSAFEARRAYBOUND;   
   Index:integer;   
   v:Variant;   
   n, nPos: integer;   
   szDefault: 
string;   
begin  
   szCode:
= Memo1.Text;   
   szDefault:
= 'function DefaultFun(){result = '+''Hello,Baby.''+';return result;};';   
   
if szCode = ' then  
   begin  
     szCode:
= szDefault;  
   
end;  
   ScriptControl1.Reset;  
   ScriptControl1.Language:
='JScript';  
   
//添加自定义函数  
   scriptcontrol1.addCode(szCode);  
   
//参数为一维有一个元素的SafeArray  
   bound.lLbound:
=0;  
   bound.cElements:
=1;  
   
try  
     Parameters :
= SafeArrayCreate(VT_VARIANT, 1, bound);  
   
except  
     ShowMessage(
'分配内存错误');  
     Exit;  
   
end;  
   V:
=9;  
   Index:
=0;  
   SafeArrayPutElement(Parameters,Index,V);  
   nPos:
= pos('(', szCode);   
  
   szFunName:
= copy(szCode, 9, nPos-9);   
   szFunName:
= Trim(szFunName);   
   
try  
     ShowMessage(ScriptControl1.Run(szFunName,Parameters));   
   
finally  
     SafeArrayDestroy(Parameters);   
   
end;      
end;  

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphi:TStringList的详细用法(转载)发布时间:2022-07-18
下一篇:
[Delphi源码]防止DEDE反编译的DELPHI程序发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap