這個問題是前幾天群里一位群友提出的問題,如何使用nsis獲取符號鏈接的實際路徑,說實話當時還是有點蒙的,因為NSIS作為一個軟體安裝包制作的腳本系統,這種應用場景還是非常少的,并且NSIS天生就不支持作業系統的高級檔案系統功能!所以問題就顯得比較生僻!后來又去惡補了一下關于符號鏈接的作業原理和相關資料,發現目前為止,關于nsis操作軟連接的教程和資料在國內外還是個空白,所以決定寫一篇關于這方面的博文刷下存在感,
話歸正題,因為NSIS本身不支持高級檔案系統功能,所以開始考慮使用winAPI來進行操作,文中涉及三個api函式,CreateFile,CreateSymbolicLink和GetFinalPathNameByHandle,前兩個是為了方便功能演示而創建的源檔案及其符號鏈接,重點在第三個函式GetFinalPathNameByHandle,它是實作獲取符號鏈接實際路徑的關鍵!幾經除錯修改,范例腳本完成,
注意,這不是生產樣本,提供的只是一種思路與功能完成途徑,應用中需要自己再去完善各種運行條件和環境判斷!
#獲取符號鏈接實際路徑
!include "FileFunc.nsh"
#撰寫:水晶石
OutFile 'Nsistest.exe'
Section
#創建源檔案
StrCpy $R0 C:\example
StrCpy $R1 D:\softlink
CreateDirectory $R0
System::Call "kernel32::CreateFile(t `$R0\a.txt`, i 0x40, i 0, i 0, i 4, i 0, i 0) p .r0"
#創建軟連接,$R1為軟連接
System::Call "kernel32::CreateSymbolicLink(t `$R1`, t `$R0`, i 0x1) i .s"
#讀取創建的軟連接源檔案目標位置
FileOpen $0 $R1\a.txt r
System::StrAlloc 64
Pop $3
System::Call "kernel32::GetFinalPathNameByHandle(p r0, t.r1, i r3,i0x0)i.r2"
System::Call "kernel32::CloseHandle(p r0) i.s"
StrCpy $1 "$1" "" 4
${GetParent} "$1" $1
MessageBox MB_OK "源檔案目錄為:$1"
System::Free $3
SectionEnd
本文來自博客園,作者:水晶石,轉載請注明原文鏈接:https://www.cnblogs.com/NSIS/p/16788019.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/514185.html
標籤:其他
上一篇:leetcode 220. Contains Duplicate III 存在重復元素 III(困難)
下一篇:精準測驗技術十年發展漫談
