科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道学习笔记:浅析VB6语言脚本解释器

学习笔记:浅析VB6语言脚本解释器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

     讨论如何让自己的应用程序支持脚本      最初也是在CSDN的Blog上找的,但是我再次去找的时候发现已经找不到了.在此对原作者的提示表示感谢      使用范围,可以让用户开发的时候使用脚本,用exe或者dll进行接口开发虽然功能强大,

作者:builder.com.cn 2007年9月29日

关键字: 编程

  • 评论
  • 分享微博
  • 分享邮件
  
  讨论如何让自己的应用程序支持脚本
  
  最初也是在CSDN的Blog上找的,但是我再次去找的时候发现已经找不到了.在此对原作者的提示表示感谢
  
  使用范围,可以让用户开发的时候使用脚本,用exe或者dll进行接口开发虽然功能强大,但是不方便,用脚本,或者大家熟知的脚本就方便多了.
  
  方法1 :自己作编译器 解释器
  
  方法2 :利用现有的解释器,用脚本,省略编译器
  
  很明显,第二种方法简单的多.问题是现有的解释器(我叫做脚本引擎)有什么,去哪里找,怎么支持...
  
  python比较流行,可以用于游戏脚本引擎,但是我目前还不会用(毕竟,我不是上帝)
  
  VBA 就是office的vba,用vb6的语法,我选这个.因为我见了vb就特别亲切...
  
  估计凯比用不上这项技术吧....
  
  最关键的就是找到这个传说中的vba6.dll 他来负责解释
  
  Private Declare Function EbExecuteLine Lib "vba6.dll" ( _
  ByVal pStringToExec As Long, _
  ByVal Unknownn1 As Long, _
  ByVal Unknownn2 As Long, _
  ByVal fCheckOnly As Long) As Long
  
  dll声明,顾名思义,就是执行一行
  
  第一个参数,指向命令行字符串的指针
  
  剩下的参数不知道作甚么用的......
  
  用的时候:
  
  封装一下这样用起来方便
  Function stepline(ByVal cmd As String) As Long 'cmd就是vb6代码
  Dim l As Long '临时变量,意义不大
  l = EbExecuteLine(StrPtr(ByVal cmd), 0, 0, 0) '这就是实质,简单吧
  Debug.Print CStr(l) + ":" + cmd '调试用的,无意义
  
  End Function
  
  你可以直接这么用
  Debug.Print EbExecuteLine(StrPtr("dim a as long,b as long,c as long"), 0, 0, 0)
  Debug.Print EbExecuteLine(StrPtr("a=" & 3), 0, 0, 0)
  Debug.Print EbExecuteLine(StrPtr("b=" & 5), 0, 0, 0)
  Debug.Print EbExecuteLine(StrPtr("c=" & 2), 0, 0, 0)
  Debug.Print EbExecuteLine(StrPtr("clipboard.settext (a+b)/c"), 0, 0, 0)
  Debug.Print EbExecuteLine(StrPtr("msgbox Clipboard.GetText"), 0, 0, 0)
  
  也可以
  stepline "dim a as long,b as long,c as long"
  stepline "a=" & 3
  stepline "b=" & 5
  stepline "c=" & 2
  stepline "clipboard.settext (a+b)/c"
  stepline "msgbox Clipboard.GetText"
  
  或者将文本放入listbox,甚至可以逐行进行(当然,有兴趣你可以自己做调试器)
  If List1.ListCount = 0 Then
  MsgBox "没有代码"
  Else
  List1.ListIndex = 0
  Dim i As Long
  For i = 0 To List1.ListCount - 1
  stepline List1.List(i)
  Next
  End If
  
  当然,直接执行文本也是可以的
  假定text1.text是全部的代码
  
  List1.Clear
  Dim Arr() As String
  Dim i As Long
  Dim s As String
  Arr = Split(Text1.Text, Chr(13) + Chr(10))
  For i = 0 To UBound(Arr())
  stepline Arr(i)
  Next
  
  简单吧
  
  而且这些完全是面向对象的
  
  你的程序就相当于虚拟机,vba6.dll就是解释器
  
  脚本可以做什么!!连API跟COM都可以用
  
  如果你的虚拟机支持(就是程序提供现有的对象),他可以直接用(也称为API,不过是你提供的,不是Windows提供的而已)
  
  给出几个实例脚本(以下是过程,自动填充到text1)
  
  Private Sub Command4_Click()
  Text1.Text = "'例子 VB6语法"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "dim a as long,b as long,c as long"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "a=" & 3
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "b=" & 5
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "c=" & 2
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "clipboard.settext (a+b)/c"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "msgbox Clipboard.GetText"
  End Sub
  
  Private Sub Command5_Click()
  Text1.Text = "'例子 真的是面向对象的,更改新的标题"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "dim f as form1"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "set f = new form1"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "f.show"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "f.caption=""aaaa"" "
  End Sub
  
  Private Sub Command6_Click()
  Text1.Text = "'例子 运行应用程序,并且发送按键!!"
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "shell ""notepad.exe c:\example.txt"",vbnormalfocus "
  Text1.Text = Text1.Text + Chr(13) + Chr(10) + "sendkeys ""Hello World!"" "
  
  End Sub

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章