問題:
内部から 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(&VolumeNameBuffer[0])), uintptr(nVolumeNameSize), // Other parameters... 0) fmt.Println(ret, callErr, syscall.UTF16ToString(VolumeNameBuffer)) }</code>
以上が安全でないパッケージを使用して Go で Get VolumeInformation WinAPI 関数を安全に呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。