我创建了自己的dll
,它公开了一个实用程序方法,即GenarateID
。头文件看起来像这样:
#ifndef GENERATE_ID_H
#define GENERATE_ID_H
#include <windows.h>
#include <string>
#include <fstream>
#include <stdio.h>
#include "openssl/sha.h"
int __declspec(dllexport) GenerateID(const char* fileName, char* retVal);
// some additional helper methods declared here, but omitted for brevity
// ...
#endif // GENERATE_ID_H
这种方法有什么作用
它读取作为第一个参数传递的二进制文件,获取一些数据,生成该数据的SHA256哈希,并通过第二个参数返回。成功时,返回的int值为0,否则为负值。这里值得一提的是,我为此使用了OpesSL库。
现在,问题就从这里开始了。正如标题所说,我无法使用System::Call
从NSIS调用我的dll
。(我创建了一个简单的控制台测试可执行文件,它可以毫无问题地调用库。)
以下是我在这个简短教程的基础上尝试的内容:
# copy the files
SetOutPath $INSTDIR
SetOverwrite on
File C:UsersStrahinjaDesktopCRXtestfile.zip # copy the binary
File C:OpenSSL-Win32libeay32.dll # copy OpenSSL library
File C:UsersStrahinjaDesktopCRXIDGeneratorReleaseIDGenerator.dll # copy my dll
# generate id
StrCpy $R0 "testfile.zip"
StrCpy $R1 ${NSIS_MAX_STRLEN} ;assign memory to out parameter ?
StrCpy $R2 -1
#System::Call 'IDGenerator::GenerateID(t, t)i (r10, .r11).r12'
System::Call 'IDGenerator::GenerateID(t r10,t .r11)i.r12'
DetailPrint "File parameter: $R0"
DetailPrint "Generated ID: $R1"
DetailPrint "Return value: $R2"
NSIS说返回的值是error
。有没有办法检查错误是什么,更重要的是,我用对了吗?
附带说明:我尝试使用exe
而不是dll
,以与dll
相同的方式将其复制到相同的目录中,并使用:调用它
nsExec::ExecToStack '"myidgen.exe"'
Pop $R2
Pop $R1
这里的可执行文件运行良好,但我仍然更喜欢dll。我感觉这可能与调用约定或dllexport
有关(因为它使用了名称篡改,AFAIK)
有什么建议吗?
Error通常意味着语法错误,但也可能意味着LoadLibrary或GetProcAddress失败。使用Dependency Walker检查导出的函数是否具有修饰名称。
您可能需要使用DEF文件来导出该函数。
如果你使用EXTERN_C int __cdecl __declspec(dllexport) foo()
,它也应该在没有修饰的情况下导出,但你需要将?c
附加到系统调用的末尾。。。