簡體   English   中英

我如何調用一個使用NSIS系統插件導入另一個dll的dll

[英]How can i call a dll that import another dll using NSIS system plugin

我是NSIS安裝程序的新手。 我得說NSIS的部署很棒。 但是最近我遇到了一個問題。

我正在使用NSIS腳本來調用A.dll,該文件是使用Visual C ++編譯並導出一些C函數的。 和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嗎? 提前致謝。 對不起,英語不好。 希望你們明白我的意思。

加載程序找不到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)'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM