3

DLLファイルに基づくシリアルチェック関数の作成を手伝ってもらえますか? 残念ながら、Function Prototype はありません。

私が持っているのは、関数の NSIS バージョンです。

SetOutPath $PLUGINSDIR
  File "serialtest.dll"
   System::Call "serialtest::_sn_serialtest(t r1) i .r2 ?u"
  ${If} $2 == 0
   Messagebox MB_OK|MB_ICONSTOP \
    "Invalid Serial Number!"
   Abort
  ${Endif}

t- テキスト、文字列 (LPCSTR、最初の文字へのポインター)

r1-r9- これらは、NSIS の場合は $1 から $9 です (入力または出力の場合があります)。この場合、r1 は $1 で、$1 はデリミタ「-」付きのシリアル番号です。

i- int (char、byte、short、ハンドル、ポインタなどを含む)

.- 入力がないことを意味します

u- DLL をアンロード

追加情報: NSIS スクリプトは ANSI で書かれており、Inno Setup の Unicode バージョンを使用しています。

可能であれば、シリアル番号は編集ボックスからインポートする必要があります - ここでカスタム シリアル ページに関する質問をしました: Inno Setup のシリアル番号の CustomPage

4

2 に答える 2

2

返信する前に他の回答が受け入れられたので、追加情報を追加します。

NSIS プラグインはエクスポートされた関数に cdecl を使用しますが、通常は WinAPI を呼び出すために使用されるため、System::Call はデフォルトで stdcall です。(最後に必要なcdecl?cの場合)

t タイプは NSIS のバージョンに依存し、通常のビルドではそうでchar*あり、Unicode ビルドではそうですWCHAR*(t は のようTCHARで、 と には w と m もありますWCHAR) char

あなたの質問の関数のCプロトタイプはint WINAPI _sn_serialtest(LPCTSTR);、あなたの場合はLPCTSTR=LPCSTRWINAPI=__stdcallです。

于 2012-05-07T13:16:56.357 に答える
2

私は NSIS をまったく知らないので、以下はスクリプト解釈の試みにすぎません。

serialtest::_sn_serialtest(t r1) i .r2 ?u

私はこのように理解しています:

serialtest.dll - 関数がインポートされるライブラリです
t - LPCSTR として型指定された入力文字列
i - 整数の結果が入力変数なし (出力変数のみ) に入れられます

したがって、プロトタイプは次のようになります。

int _sn_serialtest(
  __in LPCSTR sn
);

ここで欠けているのは呼び出し規約の表記です。そのため、次のプロトタイプは機能しない可能性があります。ライブラリが C で記述されていることがわかっている場合 (Google で調べた NSIS プラグインのほとんどは何ですか)、おそらく cdecl のようになります。以下、あくまで私の推測ですので、違うかもしれません。

function _sn_serialtest(sn: AnsiString): Integer;
  external '_sn_serialtest@files:serialtest.dll cdecl';
于 2012-05-07T11:06:55.780 に答える