System::Call '${sysGetDiskFreeSpaceEx}(r0,.,,.r1)'
如果我正确,r0:目录名,空闲字节数,字节数,空闲字节数,但实际上是什么意思r0,。,。,r1? 谢谢你的帮助!
答案 0 :(得分:1)
$ {...}是一个定义,所以当你想知道某些事情是如何工作的时候,你应该做的第一件事是找出定义的作用:!error "${sysGetDiskFreeSpaceEx}"
将打印!error: kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l) i
在System readme中你会发现这个金块:
PARAMS,RETURN和OPTIONS可以在一次Get / Call中重复多次 线。重复时,可以省略很多,只有你想要的东西 改变可以使用。类型,来源和/或目的地可以省略 每个参数,甚至返回值。可以添加选项或 除去。这允许您定义函数原型并保存 一些打字。
因此$ {sysGetDiskFreeSpaceEx}是一个原型,它指定参数计数和类型,但它没有指定参数源和目标。
参数语法是什么?
参数列表以逗号分隔。每个参数组合在一起 三个值:类型,来源和目的地。类型可以是整数, 一个字符串等。来源,它是参数值的来源,可以 是NSIS寄存器($ 0,$ 1,$ INSTDIR),NSIS堆栈,具体 值(5,"测试"等)或没有(null)。目的地,即 调用返回后参数值的目的地,可以是a NSIS寄存器,NSIS堆栈或没有任何意味着没有输出 需要。源或目标中的任何一个也可以是点(`。') 如果不需要的话。
我们现在可以展开整个来电!error 'System::Call "${sysGetDiskFreeSpaceEx}(r0,.,,.r1)"'
,这会给我们!error: System::Call 'kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l) i(r0,.,,.r1)'
如果我们合并重复的参数定义,我们得到kernel32::GetDiskFreeSpaceEx(tr0, *l., *l, *l.r1)i
。
因此参数1是一个字符串(MSDN上的LPTSTR),源r0(NSIS寄存器$ 0)。
参数2和3没有源且没有目标,只有参数2使用a。 (点)但最终结果是一样的;没有输入,没有输出。这里唯一重要的部分是* l所以系统插件知道参数有多大。
最后一个参数是一个64位数字(l)的指针(*),没有输入(。),我们要求输出存储在$ 1(r1)中。
系统插件调用本机Windows API,因此查看MSDN以查看您要调用的内容about the function通常很有用。
答案 1 :(得分:0)
鉴于$0
.. $9
和$R0
.. $R9
为NSIS registers,符号r0
- > System插件使用r9
(resp。R10
.. R19
或R0
.. R9
)来指定$0
。 。$9
(resp。$R0
.. $R9
)使用系统API或其他dll函数调用注册为源和/或目标。
如果不需要,源或目标中的任何一个也可以是点(.
)。
在system plugin文档中查找“调用函数”和“可用的源和目标”部分。