之前作了尝试,证实可行,最近有时间就整理一下,重新定了个方案:
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代替