Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Memanggil Fungsi WinAPI GetVolumeInformation dalam Go Menggunakan Pakej Tidak Selamat?

Bagaimana untuk Memanggil Fungsi WinAPI GetVolumeInformation dalam Go Menggunakan Pakej Tidak Selamat?

Linda Hamilton
Linda Hamiltonasal
2024-10-25 04:14:301133semak imbas

How to Safely Call the GetVolumeInformation WinAPI Function in Go Using the Unsafe Package?

Cara Memanggil Fungsi WinAPI GetVolumeInformation dalam Go

Masalah:

Apabila cuba memanggil fungsi GetVolumeInformation dari dalam program Go, ralat berlaku disebabkan oleh operasi penunjuk yang tidak selamat.

Latar Belakang:

Fungsi GetVolumeInformation mendapatkan semula maklumat tentang volum yang ditentukan, termasuk namanya. Ia memerlukan beberapa parameter input dan output untuk berfungsi.

Penyelesaian:

Untuk menyelesaikan ralat, adalah penting untuk memahami tujuan dan penggunaan pakej yang tidak selamat dalam Go. Pakej yang tidak selamat membenarkan manipulasi langsung alamat memori, memintas jenis keselamatan bahasa. Walau bagaimanapun, ia harus digunakan dengan berhati-hati.

Salah satu operasi yang tersedia untuk pakej tidak selamat ialah menukar penuding kepada jenis tertentu kepada Penunjuk, yang mewakili penuding kepada jenis arbitrari. Fleksibiliti ini membolehkan untuk membaca dan menulis lokasi memori sewenang-wenangnya.

Dalam kod yang disediakan, ralat timbul kerana VolumeNameBuffer telah dihantar ke fungsi GetVolumeInformation menggunakan tidak selamat.Pointer(&lpVolumeNameBuffer). Barisan ini cuba menukar pembolehubah rentetan kepada Penunjuk.

Kod Disemak:

Untuk menangani isu ini, kod boleh menggunakan tatasusunan uint16 (saiz yang ditentukan oleh syscall.MAX_PATH) untuk menerima nama volum dan menyampaikannya sebagai hujah kepada fungsi GetVolumeInformation. Pendekatan ini mengelakkan keperluan untuk menggunakan Penunjuk dan memastikan keselamatan jenis.

<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(&amp;VolumeNameBuffer[0])),
        uintptr(nVolumeNameSize),
        // Other parameters...
        0)
    fmt.Println(ret, callErr, syscall.UTF16ToString(VolumeNameBuffer))
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Memanggil Fungsi WinAPI GetVolumeInformation dalam Go Menggunakan Pakej Tidak Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn