問題:
嘗試從內部程式中呼叫內部。 ,由於不安全的指針操作而發生錯誤。
背景:
GetVolumeInformation 函數檢索有關指定卷的信息,包括其名稱。它需要多個輸入和輸出參數才能運作。
解決方案:
要解決該錯誤,了解 Go 中不安全包的目的和用法至關重要。 unsafe 套件允許直接操作記憶體位址,繞過語言的類型安全。不過,應該謹慎使用。
unsafe 套件可用的操作之一是將指向特定類型的指標轉換為 Pointer,它表示指向任意類型的指標。這種靈活性允許讀取和寫入任意記憶體位置。
在提供的程式碼中,出現錯誤是因為使用 unsafe.Pointer(&lpVolumeNameBuffer) 將 VolumeNameBuffer 傳遞給 GetVolumeInformation 函數。此轉換嘗試將字串變數轉換為指標。
修訂的程式碼:
要解決此問題,程式碼可以使用uint16 陣列(大小為由syscall.MAX_PATH 決定)以接收磁碟區名稱並將其作為參數傳遞給GetVolumeInformation 函數。這種方法避免了使用指標並確保類型安全。
<code class="go">import ( "fmt" "syscall" "unsafe" ) func main() { var RootPathName = `C:\` var VolumeNameBuffer = make([]uint16, syscall.MAX_PATH+1) var nVolumeNameSize = uint32(len(VolumeNameBuffer)) // Other parameters... kernel32, _ := syscall.LoadLibrary("kernel32.dll") getVolume, _ := syscall.GetProcAddress(kernel32, "GetVolumeInformationW") var nargs uintptr = 8 ret, _, callErr := syscall.Syscall9(uintptr(getVolume), nargs, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(RootPathName))), uintptr(unsafe.Pointer(&VolumeNameBuffer[0])), uintptr(nVolumeNameSize), // Other parameters... 0) fmt.Println(ret, callErr, syscall.UTF16ToString(VolumeNameBuffer)) }</code>
以上是如何使用Unsafe套件安全地呼叫Go中的GetVolumeInformation WinAPI函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!