3

您能帮我创建基于 DLL 文件的串行检查功能吗?不幸的是我没有函数原型。

我所拥有的是该功能的 NSIS 版本:

SetOutPath $PLUGINSDIR
  File "serialtest.dll"
   System::Call "serialtest::_sn_serialtest(t r1) i .r2 ?u"
  ${If} $2 == 0
   Messagebox MB_OK|MB_ICONSTOP \
    "Invalid Serial Number!"
   Abort
  ${Endif}

t- 文本,字符串(LPCSTR,指向第一个字符的指针)

r1-r9- 这些对于 NSIS 来说是 1-9 美元(可以输入或输出)。在这种情况下,r1 是 $1,$1 是带有分隔符“-”的序列号。

i- int(包括 char、byte、short、句柄、指针等)

.- 表示没有输入

u- 卸载 DLL

附加信息:NSIS 脚本是用 ANSI 编写的,我使用的是 Unicode 版本的 Inno Setup。

如果可能,应该从编辑框导入序列号 - 我在这里问了一个关于自定义序列页面的问题:Inno Setup 中序列号的自定义页面

4

2 回答 2

2

我根本不知道NSIS,所以下面只是一个脚本解释的尝试:

serialtest::_sn_serialtest(t r1) i .r2 ?u

我是这样理解的:

serialtest.dll - 是从
t 导入函数的库 - 输入字符串类型为 LPCSTR
i - 整数结果放入无输入变量(所以只是输出变量)

所以你的原型可能看起来像这样:

int _sn_serialtest(
  __in LPCSTR sn
);

我在这里缺少的是一些调用约定符号,所以下面的原型可能不起作用,如果你知道这个库是用 C 编写的(我用谷歌搜索的大多数 NSIS 插件是什么),那么它可能是 cdecl,比如下面,但这只是我的猜测,可能会有所不同:

function _sn_serialtest(sn: AnsiString): Integer;
  external '_sn_serialtest@files:serialtest.dll cdecl';
于 2012-05-07T11:06:55.780 回答
2

在我有机会回复之前,另一个答案已被接受,因此我将添加一些其他信息:

虽然 NSIS 插件使用 cdecl 作为其导出函数,但 System::Call 默认为 stdcall,因为它通常用于调用 WinAPI。(对于 cdecl 你?c最后需要)

t 类型取决于 NSIS 版本,在正常构建中它是char*,在 unicode 构建中它是WCHAR*(t 就像TCHAR,你也有 w 和 m 用于WCHARand char)。

您问题中函数的 C 原型是int WINAPI _sn_serialtest(LPCTSTR);,在您的情况下LPCTSTR=LPCSTRWINAPI= __stdcall

于 2012-05-07T13:16:56.357 回答