学习笔记,VB6语言脚本解释器

本文介绍让应用程序支持脚本的方法,对比了自制编译器解释器和利用现有解释器两种方式,选择用VBA(基于vb6语法),通过vba6.dll负责解释。给出了dll声明及使用示例,还展示了多种执行脚本的方式,最后列举了几个脚本实例。
关键字: VB 脚本  作者:董含君

本文介绍的是最简单的办法,要求不高仅仅执行部分代码

如果想使用更加完全的功能需要的是 Micrsoft Script Control


请参考叶帆达人的文章

VBScript脚本运用(脚本程序与宿主程序的交互)  http://blog.youkuaiyun.com/yefanqiu/archive/2004/10/15/137928.aspx

VBScript脚本运用 http://www.bjjr.com.cn/YeFan/SourceCode/YFVBScript.rar



讨论如何让自己的应用程序支持脚本

最初也是在优快云的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


<think>嗯,用户这次的问题很明确,直接询问我是否具备使用PML和.NET为PDMS开发插件的能力。看来用户可能是个工程师或开发者,正在评估技术方案可行性。 从对话历史看,用户之前已经了解过PDMS插件的类型和功能,现在聚焦到具体开发技术栈了。用户引用的学习笔记提到PML窗体开发、PML语言基础和.NET编程,说明用户可能正在查阅相关技术资料。 关于PML能力:这是PDMS原生的脚本语言,我掌握其核心语法和开发模式。比如用PML实现表单交互、模型遍历、属性修改等常规操作。但需要注意PML的局限性——它更适合轻量级扩展,复杂业务逻辑可能受限。 关于.NET能力:通过Aveva提供的PML.NET框架,可以构建更强大的插件。我熟悉C#与PML的互操作机制,比如用.NET开发DLL供PML调用,或直接通过API操作模型数据。但实际开发需要配置特定SDK环境。 用户可能隐含的真实需求是:想确认这两种技术路线的开发成本和效果。需要强调PML适合快速小工具开发,而.NET适合高性能复杂模块。如果用户有具体场景,可以进一步分析技术选型。 最后要提醒依赖项:无论哪种方案,都需要对应版本的PDMS开发许可,且.NET开发需安装Aveva提供的Adapter组件。这些实施细节可能影响用户决策。</think>是的,我具备使用 **PML(PDMS Macro Language)** 和 **.NET(通过 Pml.Net 或 Advance PML 框架)** 为 AVEVA PDMS/E3D 开发插件的能力。以下是具体说明: --- ### **1. PML 语言开发** **PML** 是 PDMS 的原生脚本语言,用于: - **自动化建模**:创建管道、设备、结构等元素。 - **定制界面**:开发自定义对话框、工具栏和菜单。 - **数据处理**:提取模型属性、生成报告(如材料清单)。 - **规则检查**:实现碰撞检测、规范符合性验证。 **示例:PML 创建管道** ```pml !! 创建管道并设置属性 $p = new PIPE() $p.Name = 'MAIN_PIPE' $p.Diameter = 300 $p.Material = 'CARBON_STEEL' $p.Create() ``` **典型应用场景**: - 批量修改模型属性。 - 生成定制化 ISO 图纸或报表[^1]。 - 开发轻量级交互工具(如快速定位元件)。 --- ### **2. .NET 语言开发** 通过 **Pml.Net** 或 **Advance PML**,可用 C#/VB.NET 实现更强大的功能: - **高性能计算**:复杂几何处理、算法优化。 - **外部集成**:连接数据库、ERP 系统或云平台。 - **高级界面**:开发 WPF/WinForms 应用嵌入 PDMS。 - **混合编程**:.NET 调用 PML 脚本,结合两者优势。 **示例:C# 调用 PML 命令** ```csharp using Aveva.Pdms.Utilities.CommandLine; ... // 执行 PML 命令创建阀门 Command.RunCommand("create valve /type GATE_VALVE /pos (5,0,0)"); ``` **典型应用场景**: - 与 Revit/AutoCAD 等 BIM 工具交互。 - 开发云端协同插件(如实时模型同步)。 - 构建机器学习驱动的智能设计模块。 --- ### **技术栈支持** | **开发方式** | **语言** | **适用场景** | **依赖环境** | |--------------|----------------|----------------------------------|---------------------------| | **原生 PML** | PML 脚本 | 快速自动化、简单界面扩展 | PDMS 内置解释器 | | **Pml.Net** | C#/VB.NET | 高性能计算、外部系统集成 | PDMS + .NET Framework | | **Advance PML** | C# | 复杂插件开发(窗体/服务/API) | AVEVA Extension Framework | --- ### **注意事项** 1. **版本兼容性**: - PML 语法需匹配 PDMS/E3D 版本(如 E3D 对 PML2 支持更佳)。 - .NET 插件需对应 Framework 版本(通常 ≥4.5)。 2. **调试工具**: - PML 可用 `!!DEBUG` 命令输出日志。 - .NET 插件需用 Visual Studio 附加 PDMS 进程调试。 3. **部署要求**: - PML 脚本可直接放置于 `PMLLIB` 目录。 - .NET 插件需注册 DLL 并配置许可。 > 如需具体开发指导(如创建带界面的参数化建模工具),可提供场景需求,我会给出详细实现方案。 --- **相关问题**: 1. 如何调试 PDMS 的 PML 脚本? 2. PML.NET 和 Advance PML 开发有何区别? 3. 能否用 .NET 为 PDMS 开发云同步插件? [^1]: 引用内容参考了 AVEVA PDMS 二次开发学习笔记的框架。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值