Delphi脚本语言注入

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 ;  

 

 

转载于:https://www.cnblogs.com/rogee/archive/2010/09/14/1827243.html

你可能感兴趣的:(Delphi脚本语言注入)