博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi脚本语言注入
阅读量:6149 次
发布时间:2019-06-21

本文共 2478 字,大约阅读时间需要 8 分钟。

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

你可能感兴趣的文章
NGUI Label Color Code
查看>>
.NET Core微服务之基于Polly+AspectCore实现熔断与降级机制
查看>>
vue组件开发练习--焦点图切换
查看>>
浅谈OSI七层模型
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
python实现牛顿法求解求解最小值(包括拟牛顿法)【最优化课程笔记】
查看>>
js中var、let、const的区别
查看>>
腾讯云加入LoRa联盟成为发起成员,加速推动物联网到智联网的进化
查看>>
从Python2到Python3:超百万行代码迁移实践
查看>>
Windows Server已可安装Docker,Azure开始支持Mesosphere
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
微软正式发布PowerShell Core 6.0
查看>>
Amazon发布新的会话管理器
查看>>
InfoQ趋势报告:DevOps 和云计算
查看>>
舍弃Python,为什么知乎选用Go重构推荐系统?
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>