在NSIS中调用内核函数的基本理解

时间:2017-11-13 13:14:43

标签: nsis

在NSIS中,我正在浏览一些调用Windows的某些功能的API。

例如:

  1. Kernel32::SetEnvironmentVariable(t, t)i ("VAR1", "$R0").r0

  2. Kernel32::GetLocaleInfo(i,i,t,i)i(2048,0x2,.r0,${NSIS_MAX_STRLEN})i

  3. 由于我是新手,有谁能解释一下这里发生了什么?什么是ti.ro等?

    我知道kernel32是一个DLL而SetEnvironmentVariable& GetLocaleInfo是此DLL中定义的函数。

1 个答案:

答案 0 :(得分:1)

The documentation会告诉您ti是什么。

System :: Call的基本语法是module::function(parameters)return。参数和返回是可选的,它们都遵循相同的基本格式:输入输出。如果需要输入和/或输出,则类型不是可选的。

参数和返回可以重复多次,这仅在函数原型作为定义存在时才有用,但您有时也会在NSIS Wiki上看到此语法。 Kernel32::SetEnvironmentVariable(t, t)i ("VAR1", "$R0").r0Kernel32::SetEnvironmentVariable(t "VAR1", t "$R0")i.r0完全相同。使用define时,它看起来像这样:

!define SetEnvironmentVariable "Kernel32::SetEnvironmentVariable(t, t)i"
System::Call '${SetEnvironmentVariable}("VAR1", "$R0").r0'

如果您在使用系统插件时了解C / C ++或Delphi等语言,那将非常有用,因为您需要了解基本的Windows类型以及通常如何使用函数。

例如,如果你想调用GetWindowsDirectory函数,你首先要look at the function on MSDN

UINT WINAPI GetWindowsDirectory(_Out_ LPTSTR lpBuffer, _In_ UINT uSize);

将其翻译为NSIS会为您提供Kernel32::GetWindowsDirectory(t, i)i的初始框架(WINAPI是默认的调用约定)。 t映射到Windows TCHAR*类型,i是32位整数,与ULONGLONGDWORD,{相同Windows SDK中的{1}},INTUINTINT32。 唯一缺失的部分是输入和输出。 MSDN声明使用SAL注释进行修饰,因此很容易看到输入哪些参数以及输出哪些参数。

一个工作示例可能如下所示:

UINT32
如果没有输入,

System::Call 'Kernel32::GetWindowsDirectory(t .r1, i ${NSIS_MAX_STRLEN})i .r0' DetailPrint "Return=$0 Output1=$1" 可以用作“无”占位符。在这种情况下,我们使用它两次。使用System :: Call时返回值从不输入,我们还有一个仅输出参数。

.r1r0$1 NSIS寄存器的别名,当您需要输出某些内容时,必须使用这些别名。普通的NSIS寄存器可以用作输入,但是变量扩展发生在NSIS内部而不是插件中,这可能会导致字符串引号出现问题,如果字符串可能包含引号或合法的系统插件,则不建议这样做句法。因此,我建议您将第一个示例重写为$0

在C中你的第二个例子看起来像

Kernel32::SetEnvironmentVariable(t "VAR1", t R0)i.r0