在NSIS中,我正在浏览一些调用Windows的某些功能的API。
例如:
Kernel32::SetEnvironmentVariable(t, t)i ("VAR1", "$R0").r0
Kernel32::GetLocaleInfo(i,i,t,i)i(2048,0x2,.r0,${NSIS_MAX_STRLEN})i
由于我是新手,有谁能解释一下这里发生了什么?什么是t
,i
,.ro
等?
我知道kernel32
是一个DLL而SetEnvironmentVariable
& GetLocaleInfo
是此DLL中定义的函数。
答案 0 :(得分:1)
The documentation会告诉您t
和i
是什么。
System :: Call的基本语法是module::function(parameters)return
。参数和返回是可选的,它们都遵循相同的基本格式:输入输出。如果需要输入和/或输出,则类型不是可选的。
参数和返回可以重复多次,这仅在函数原型作为定义存在时才有用,但您有时也会在NSIS Wiki上看到此语法。 Kernel32::SetEnvironmentVariable(t, t)i ("VAR1", "$R0").r0
与Kernel32::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位整数,与ULONG
,LONG
,DWORD
,{相同Windows SDK中的{1}},INT
,UINT
和INT32
。
唯一缺失的部分是输入和输出。 MSDN声明使用SAL注释进行修饰,因此很容易看到输入哪些参数以及输出哪些参数。
一个工作示例可能如下所示:
UINT32
如果没有输入, System::Call 'Kernel32::GetWindowsDirectory(t .r1, i ${NSIS_MAX_STRLEN})i .r0'
DetailPrint "Return=$0 Output1=$1"
可以用作“无”占位符。在这种情况下,我们使用它两次。使用System :: Call时返回值从不输入,我们还有一个仅输出参数。
.
和r1
是r0
和$1
NSIS寄存器的别名,当您需要输出某些内容时,必须使用这些别名。普通的NSIS寄存器可以用作输入,但是变量扩展发生在NSIS内部而不是插件中,这可能会导致字符串引号出现问题,如果字符串可能包含引号或合法的系统插件,则不建议这样做句法。因此,我建议您将第一个示例重写为$0
。
在C中你的第二个例子看起来像
Kernel32::SetEnvironmentVariable(t "VAR1", t R0)i.r0