2015-06-09 99 views
3

我正在爲我的應用程序編寫卸載程序,並且需要檢查從哪個目錄調用卸載程序(因爲我想限制從任何其他目錄卸載)。如何獲得nsis腳本中的exe路徑?

我正在使用內置變量$EXEPATH,但它給我C:\Users\MyUser\Local\Temp\~nsu.tmp而不是當前目錄。

我也使用windows API GetModuleFileName使用nsis,但它也提供相同的輸出。如何獲取可執行文件的當前目錄?

+0

您是在尋找$ EXEDIR? – kichik

+0

@kichik'$ EXEDIR'也給出相同的輸出。 –

+0

這不應該。在您的NSIS版本中存在錯誤,或者您以非標準方式執行卸載程序。 – kichik

回答

0

C:\Users\MyUser\Local\Temp\~nsu.tmp形式的臨時目錄可能是卸載程序實際運行的目錄。

爲避免無法卸載卸載程序可執行文件的問題,因爲它在運行時被鎖定(因此它需要重新啓動才能真正刪除),因此通常會將卸載程序.exe複製到臨時位置並從該位置運行它。

如果你不希望unistaller本身進叉一個臨時目錄,你可以調用這樣說:

ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR' 

的技巧是在manual描述的_?特殊參數。

+0

我想這將工作,如果我們從nsis腳本調用卸載程序。但在我的情況下,用戶可以直接雙擊它開始卸載。 –

+0

讓我讓我的要求更清楚。假設我的軟件安裝目錄是** C:\ Program Files \ MySoftware **。我的所有二進制文件,dll和uninstaller.exe都將位於此目錄中。所以我希望卸載程序只能從這個目錄啓動。如果有人將uninstaller.exe複製到其他目錄,卸載應該不起作用,並且得到可執行文件目錄,我使用'$ EXEPATH',但它將tmp目錄作爲path.Using '_?'我們可以明確地設置這個tmp目錄,但我的要求不是這樣。 –