这条线是什么意思? (系统:call getfreediskex)

时间:2014-08-22 09:17:00

标签: nsis

System::Call '${sysGetDiskFreeSpaceEx}(r0,.,,.r1)'

如果我正确,r0:目录名,空闲字节数,字节数,空闲字节数,但实际上是什么意思r0,。,。,r1? 谢谢你的帮助!

2 个答案:

答案 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 .. $R9NSIS registers,符号r0 - > System插件使用r9(resp。R10 .. R19R0 .. R9)来指定$0。 。$9(resp。$R0 .. $R9)使用系统API或其他dll函数调用注册为源和/或目标。

如果不需要,源或目标中的任何一个也可以是点(.)。

system plugin文档中查找“调用函数”和“可用的源和目标”部分。