任务是使用Go查询Windows API并获取输入设备的系统名称.
当从Go程序调用GetRawInputDeviceInfA
函数时,我得到错误"Invalid access to memory location".下面是终端消息:
错误:对内存位置的访问无效.类型:1描述符:65599
以下是完整的代码:
package main
import (
"fmt"
"syscall"
"unsafe"
)
// defining an imitation RAWINPUTDEVICELIST
type rawInputDeviceList struct {
DeviceHandle uint64
Type uint32
}
const RIDI_DEVICENAME uint32 = 0x20000007
var (
user32 = syscall.NewLazyDLL("user32.dll")
getRawInputDeviceListProc = user32.NewProc("GetRawInputDeviceList")
getRawInputDeviceInfoProc = user32.NewProc("GetRawInputDeviceInfoA")
)
func main() {
dl := rawInputDeviceList{}
size := uint32(unsafe.Sizeof(dl))
var devCount uint32
_ = getRawInputDeviceList(nil, &devCount, size)
if devCount > 0 {
devices := make([]rawInputDeviceList, size*devCount)
for i := 0; i < int(devCount); i++ {
devices[i] = rawInputDeviceList{}
}
err := getRawInputDeviceList(&devices[0], &devCount, size)
if err != nil {
fmt.Printf("Error: %v", err)
}
uiCommand := RIDI_DEVICENAME
var pData uint32
for i := 0; i < int(devCount); i++ {
err := getRawInputDeviceInfo(&devices[i].DeviceHandle, &uiCommand, &pData, 0)
if err != nil {
fmt.Printf("Error: %v", err)
}
fmt.Printf("Type: %v Descriptor: %v \n", devices[i].Type, devices[i].DeviceHandle)
}
}
}
func getRawInputDeviceList(
rawInputDeviceList *rawInputDeviceList,
numDevices *uint32,
size uint32,
) error {
_, _, err := getRawInputDeviceListProc.Call(
uintptr(unsafe.Pointer(rawInputDeviceList)),
uintptr(unsafe.Pointer(numDevices)),
uintptr(size))
if err != syscall.Errno(0) {
return err
}
return nil
}
// Get device info
func getRawInputDeviceInfo(
deviceHandle *uint64,
uiCommand *uint32,
pData *uint32,
size uint32,
) error {
_, _, err := getRawInputDeviceInfoProc.Call(
uintptr(unsafe.Pointer(deviceHandle)),
uintptr(unsafe.Pointer(uiCommand)),
uintptr(unsafe.Pointer(pData)),
uintptr(size))
if err != syscall.Errno(0) {
return err
}
return nil
}
我认为句柄指的是真实设备的地址,并不理解是什么生成了这样的消息.有没有人能帮帮我?
附注: 我重写了函数头,出现了一条错误消息.
func getRawInputDeviceInfo(
deviceHandle uintptr,
uiCommand *uint32,
pData uintptr,
size uint32,
) error {
_, _, err := getRawInputDeviceInfoProc.Call(
deviceHandle,
uintptr(unsafe.Pointer(uiCommand)),
pData,
uintptr(size))
if err != syscall.Errno(0) {
return err
}
return nil
}
函数调用
err := getRawInputDeviceInfo(devices[i].DeviceHandle, &uiCommand, pData, size)
现在错误信息是
Error: The parameter is incorrect.Type: 1 Descriptor: 65596
Error: The parameter is incorrect.Type: 0 Descriptor: 65594