我創建了我自己的dll
,它公開了一種實用方法,即GenarateID
。頭文件看起來像這樣:NSIS System :: Call - 未能調用方法
#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,否則爲負值。有一點值得一提的是我用OpessSSL庫來達到這個目的。
現在,這裏是問題的起點。正如標題所說,我無法使用System::Call
從NSIS調用我的dll
。 (我創建簡單的控制檯測試可執行文件,調用,沒有任何問題庫)。
這裏是我試過的基礎上,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)
有什麼建議嗎?
可以擴大使用DEF文件的想法一點點?我不是一個C++的傢伙,所以一個例子會很好,它應該在解決方案中應該去哪裏,我需要在構建過程中以某種方式「包含」它?那麼我怎樣才能調用函數(按序號?)? – Less
如果您使用的是Visual Studio,您可以在MSDN上找到您需要的信息... – Anders
已經做了:)謝謝反正 – Less