dll
1 つのユーティリティ メソッド、つまり を公開する独自のメソッドを作成しました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 ハッシュを生成して、2 番目の引数で返します。成功した場合、返される int 値は 0 です。それ以外の場合は負の値です。ここで言及する価値のあることの 1 つは、この目的のために OpesSSL ライブラリを使用したことです。
さて、ここから問題が始まります。dll
タイトルが示すように、 を使用して NSIS からmy を呼び出すことができませんSystem::Call
。(問題なくライブラリを呼び出す簡単なコンソール テスト実行可能ファイルを作成しました。)
この短いチュートリアルに基づいて、私が試したのは次のとおりです。
# 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
ます
.