决定弃用System.dll了

来源:互联网 发布:mac无法格式 化u盘日志 编辑:程序博客网 时间:2024/05/01 02:48
 NSIS不用插件就可以调用API,很早前就有这样的想法,因为System插件实在太常用了(NSIS要实现强大一点的程序,没有它是很不方便的),而用插件的方式总感觉不爽,所以决定将System插件的功能整合到NSIS中。
之前作了尝试,证实可行,最近有时间就整理一下,重新定了个方案:
1. System::Call  做成内置命令 SysCall
SysCall 的用法和System::Call 一样,只是第一个参数不是通过NSIS堆栈传递的,多了的参数和插件一样:先按从右往左的顺序压入NSIS堆栈。

2. System::Get  做成内置命令 SysGet
SysGet 只接受两个参数,用法:
SysGet 用户变量(输出) "PROC [( PARAMS ) [RETURN [? OPTIONS]]]"
例如,System插件文档中的回调例子改为:
SysGet $0 "(i .r0, i .r1) isR0"
SysCall "dll::UseCallback(k r0)"

3. System::Copy  做成内置命令 MemCpy
MemCpy 最多接受三个参数,用法和System::Copy 一样,只是参数都不用通过NSIS堆栈传递

4. System::Store  做成内置命令 Store
原System::Store 参数用s 或l 是不区分大小写的,我作了一下修改:
■要压入 $0-$9  到私有堆栈,使用 s
■要压入 $R0-$R9  到私有堆栈,使用 S
■要从私有堆栈弹出 $0-$9 使用 l
■要从私有堆栈弹出 $R0-$R9 使用 L
因为20个变量很多时候都不会全部用到,这样可以在一定程度上减小临时的内存开销
其它用法和System::Store 一样,只是第一个参数不是通过NSIS堆栈传递的,多了的参数和插件一样:先按从右往左的顺序压入NSIS堆栈。

5. IntOp、IntCmp、IntCmpU 直接支持64位整数
6. System::Alloc和System::Free有没有都没什么所谓了,反正可以用SysCall代替

原创粉丝点击