ホームページ >バックエンド開発 >Golang >安全でないパッケージを使用して Go で Get VolumeInformation WinAPI 関数を安全に呼び出す方法は?

安全でないパッケージを使用して Go で Get VolumeInformation WinAPI 関数を安全に呼び出す方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 04:14:301132ブラウズ

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

Go で GetVolumeInformation WinAPI 関数を呼び出す方法

問題:

内部から GetVolumeInformation 関数を呼び出そうとしたときGo プログラムでは、安全でないポインター操作によりエラーが発生します。

Background:

GetVolumeInformation 関数は、名前を含む、指定されたボリュームに関する情報を取得します。機能するには、いくつかの入出力パラメーターが必要です。

解決策:

エラーを解決するには、Go での安全でないパッケージの目的と使用法を理解することが重要です。安全でないパッケージを使用すると、言語のタイプ セーフをバイパスして、メモリ アドレスを直接操作できます。ただし、使用には注意が必要です。

安全でないパッケージで使用できる操作の 1 つは、特定の型へのポインターを、任意の型へのポインターを表すポインターに変換することです。この柔軟性により、任意のメモリ位置の読み取りと書き込みが可能になります。

提供されたコードでは、Unsafe.Pointer(&lpVolumeNameBuffer) を使用して VolumeNameBuffer が Get VolumeInformation 関数に渡されたためにエラーが発生しました。このキャストは、文字列変数を Pointer に変換しようとします。

改訂コード:

この問題に対処するために、コードでは uint16 の配列 (サイズはこれは syscall.MAX_PATH によって決定されます) を使用してボリューム名を受け取り、それを引数として Get VolumeInformation 関数に渡します。このアプローチにより、ポインターを使用する必要がなくなり、型の安全性が確保されます。

<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>

以上が安全でないパッケージを使用して Go で Get VolumeInformation WinAPI 関数を安全に呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。