上一页 | 目录 | 下一页

D.3 使用 System.dll 插件来调用一个外部 DLL

请注意:Call、Get 和 Debug 函数不能使用 GCC 编译,因此需要下载 Windows 版本的 NSIS 然后解压 System.dll 插件或者写一个包含你需要调用函数的插件。

某些安装进程需要调用包含于第三方开发的 DLL 中的函数。最佳的例子就是安装一个 Palm(TM) 通道。

一些关于 System.dll 的背景资料
System.dll 插件 (由 Brainsucker 开发) 使你可以通过提供 'Call' 函数来调用外部 DLL 。System.dll 提供了一些其他函数,但是它们并不适合放在这里。欲了解其它函数更多详细信息,请锁上门,取下电话,然后额头紧锁的阅读 System 自述文件

数据类型
System.dll 可以识别以下数据类型:

将 System.dll 变量映射为 NSIS 里的内置变量
如果你不需要返回任何数据,那么这里没有什么可以用来调用一个外部函数的指向。System.dll 可以通过以下方式将函数变量映射为 NSIS 脚本变量:

NSIS $0..$9 可与 System.dll r0..r9 相对应; NSIS $R0..$R9 也可与 System.dll r10..r19 相对应;

每个参数由类型,输入和输出指定。可以用一个点跳过输入或输出。例如:

字符串 (一个字符数组的指针), 输入为 'happy calling':

t 'happy calling'

字符串 (一个字符数组的指针),输入从 $5 取值,并且经转换为由调用产生的数组后,最后保存到 $R8 :

t r5R8

一个整数指针,从 $1 取值并放入 $2:

*i r1r2

一个 64-bit 整数指针,输出送入堆栈,没有输入:

*l .s

通过 System.dll::Call 调用第三方 DLL 中的一个函数,Call 函数的用法如下:

System::Call 'YourDllName::YourDllFunction(i, *i, t) i(r0, .r1, r2) .r3'

后面的 '(r0, .r1, r2) .r3' 段是用来传送 DLL 和 NSIS 脚本之间的参数。就像在这个参数列表中看到的一样,类型和输入、输出是可以分开的。每个 "(参数列表) 返回值" 块不用考虑和/或添加最后一个。 在这里,第一块指定类型而第二块指定输入和输出。

开始编辑 NSIS 脚本之前
在开始编辑 NSIS 代码之前,首先需要了解要调用函数的原型。在这个例子里,我们使用 Palm 'CondMgr.dll' 中的 'CmGetHotSyncExecPath' 函数。这个函数用来返回 'HotSync.exe' 的完整路径。

函数定义

int CmGetHotSyncExecPath(TCHAR *pPath, int *piSize);

参数

返回值:

同样的,如果 buffer 太小,*int 中的值为缓冲应当的大小(TCHAR 类型)。

上面的函数的定义转换到 System.dll 定义:

CmGetHotSyncExecPath(t, *i) i

也就是,它有一个文本变量,一个整数指针,并返回一个整数值。

使用外部 DLL 函数
现在选出了函数所要做的事情,以及它是如何转换到 System.dll 格式,之后我们就可以在 NSIS 脚本中使用这个函数了。

首先, 你必须将输出目录更改为你要用的 DLL 所在的目录。如果 DLL 在系统路径中,那么它也能工作,但并没有经过测试。

下面的代码段会将 'condmgr.dll' 释放到一个临时目录中,然后执行 CmGetHotSyncExecPath 函数,并显示返回的数据。 保存这个脚本

; **** snip ****
Function loadDll

  SetOutPath $TEMP\eInspect             ; 创建临时目录
  File bin\CondMgr.dll                  ; 释放 dll
  StrCpy $1 ${NSIS_MAX_STRLEN}          ; 分配内存到 $0
  System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2'
  DetailPrint '路径: "$0"'
  DetailPrint "路径长度: $1"
  DetailPrint "返回值: $2"

FunctionEnd
; **** snip ****

这个函数将在查看详细信息页面产生下面的输出:

输出目录: c:\windows\TEMP\eInspect
解压: CondMgr.dll
路径: "C:\Dave\palm\Hotsync.exe"
路径长度: 24
返回值: 0

Written by djc

鸣谢:感谢
在此感谢 kichikSunjammer 花费了大量时间解决这些问题。同时感谢 brainsucker 首先创建了这个 System.dll 插件。 祝您好运!

上一页 | 目录 | 下一页