NSIS System :: Call - 无法调用方法

时间:2012-12-17 07:29:28

标签: c++ dll call nsis dllexport

我创建了自己的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,否则为负值。这里值得一提的是我为此目的使用了OpesSSL库。

现在,问题就出现了。正如标题所示,我无法使用dll从NSIS调用我的System::Call。 (我创建了简单的控制台测试可执行文件,它可以毫无问题地调用库。)

以下是我尝试过的内容,基于this short tutorial

# copy the files
SetOutPath $INSTDIR
SetOverwrite on
File C:\Users\Strahinja\Desktop\CRX\testfile.zip  # copy the binary
File C:\OpenSSL-Win32\libeay32.dll                # copy OpenSSL library
File C:\Users\Strahinja\Desktop\CRX\IDGenerator\Release\IDGenerator.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)
有什么建议吗?

1 个答案:

答案 0 :(得分:1)

错误通常表示语法错误,但也可能意味着LoadLibrary或GetProcAddress失败。使用Dependency Walker检查导出的函数是否具有装饰名称。

您可能希望使用DEF文件导出该函数。

如果你使用EXTERN_C int __cdecl __declspec(dllexport) foo(),它也应该在没有装饰的情况下导出,但是你需要在系统调用结束时附加?c ...