문제:
내부에서 GetVolumeInformation 함수를 호출하려고 할 때 Go 프로그램에서 안전하지 않은 포인터 작업으로 인해 오류가 발생했습니다.
Background:
GetVolumeInformation 함수는 이름을 포함하여 지정된 볼륨에 대한 정보를 검색합니다. 작동하려면 여러 입력 및 출력 매개변수가 필요합니다.
해결책:
오류를 해결하려면 Go에서 안전하지 않은 패키지의 목적과 사용법을 이해하는 것이 중요합니다. 안전하지 않은 패키지를 사용하면 언어의 유형 안전성을 우회하여 메모리 주소를 직접 조작할 수 있습니다. 그러나 주의해서 사용해야 합니다.
unsafe 패키지에 사용할 수 있는 작업 중 하나는 특정 유형에 대한 포인터를 임의 유형에 대한 포인터를 나타내는 포인터로 변환하는 것입니다. 이러한 유연성을 통해 임의의 메모리 위치를 읽고 쓸 수 있습니다.
제공된 코드에서는 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>
위 내용은 안전하지 않은 패키지를 사용하여 Go에서 GetVolumeInformation WinAPI 함수를 안전하게 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!