0

私は NSIS インストーラーの初心者です。NSIS の展開は素晴らしいと言わざるを得ません。しかし、最近私は問題に遭遇しました。

私は NSIS スクリプトを使用して、Visual C++ を使用してコンパイルし、いくつかの C 関数をエクスポートする A.dll を呼び出します。A.dll は B.dll をインポートします。そのため、インストールの最初にそれら (A.dll と B.dll) を $PLUGINSDIR に抽出します。

その後、System::call を呼び出して、A.dll の "test()" を呼び出します。しかし、それは常に「エラー」を返します。また、B.dll のインポートを削除するテストを行ったところ、"test()" が機能し、期待どおりの値が返されました。

コードは次のとおりです。

;extract dll file

InitPluginsDir

SetOutPath $PLUGINSDIR

File "A.dll"

File "B.dll"

…………

;call it
code:
System::Call "$PLUGINSDIR\A::test() i.r0"

$0 は「エラー」を返します

B.dll のインポートを削除し、A.dll を再コンパイルした後。test() は正常に動作します。

NSISシステムプラグインを使用して別のdllをインポートするdllを呼び出すにはどうすればよいですか? 前もって感謝します。下手な英語でごめんなさい。皆さんが私の言いたいことを理解してくれることを願っています。

4

1 に答える 1

0

ローダーは B.dll を見つけることができないため、A.dll の LoadLibrary (system.dll によって呼び出される) は失敗します。

作業ディレクトリを設定できます。

Push $outdir ; Save current, not required
SetOutPath $pluginsdir
System::Call "$PLUGINSDIR\A::test() i.r0"
pop $outdir
SetOutPath $outdir ; Restore

または、B.dll を自分でロードすることもできます。

System::Call 'KERNEL32::LoadLibrary(t "$PLUGINSDIR\B.dll")i.s'
System::Call "$PLUGINSDIR\A::test() i.r0"
System::Call 'KERNEL32::FreeLibrary(is)'
于 2013-11-07T23:50:05.050 に答える