2

dll1 つのユーティリティ メソッド、つまり を公開する独自のメソッドを作成しました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ます
.

4

1 に答える 1

1

エラーは通常、構文エラーを意味しますが、LoadLibraryまたはGetProcAddressが失敗したことを意味する場合もあります。Dependency Walkerを使用して、エクスポートされた関数に装飾された名前があるかどうかを確認します。

関数をエクスポートするには、DEFファイルを使用することをお勧めします。

使用する場合はEXTERN_C int __cdecl __declspec(dllexport) foo()、装飾なしでエクスポートする必要があります?cが、システムコールの最後に追加する必要があります...

于 2012-12-17T08:00:56.587 に答える