我正在尝试调用RegisterDeviceNotificationW
中的函数user32.dll
。但是该函数的第一个参数是“将接收设备事件的窗口或服务的句柄”(这是我从Microsoft获得的信息)。
基于Cloud Printer Connector,我尝试使用svc.StatusHandler()
获取处理程序,但对我不起作用,每次运行时,都会出现以下错误:
句柄无效。
好吧,使用与sys
的{{3}}相同的代码,我创建了自己的“服务”,用beep
替换了RegisterDeviceNotification
函数(与{ {3}}),并发送了我的服务名称和从svc.StatusHandler()
返回的值,但我再次收到了相同的消息:“句柄无效。”
var (
u32 = syscall.MustLoadDLL("user32.dll")
registerDeviceNotificationProc = u32.MustFindProc("RegisterDeviceNotificationW")
)
在这里我需要发送一个有效的处理程序
func RegisterDeviceNotification(handle windows.Handle) error {
var notificationFilter DevBroadcastDevinterface
notificationFilter.dwSize = uint32(unsafe.Sizeof(notificationFilter))
notificationFilter.dwDeviceType = DBT_DEVTYP_DEVICEINTERFACE
notificationFilter.dwReserved = 0
// BUG(pastarmovj): This class is ignored for now. Figure out what the right GUID is.
notificationFilter.classGuid = PRINTERS_DEVICE_CLASS
notificationFilter.szName = 0
r1, _, err := registerDeviceNotificationProc.Call(uintptr(handle), uintptr(unsafe.Pointer(¬ificationFilter)), DEVICE_NOTIFY_SERVICE_HANDLE|DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
if r1 == 0 {
return err
}
return nil
}
func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) {
h := windows.Handle(uintptr(unsafe.Pointer(m)))
err := RegisterDeviceNotification(h)
fmt.Println(err)
}
注意:我也尝试使用“ myService”指针:
h := windows.Handle(uintptr(unsafe.Pointer(m)))
err := RegisterDeviceNotification(h)
编辑:我尝试使用examples,但不起作用:
检索当前进程的伪句柄。
h, err := syscall.GetCurrentProcess()
err = RegisterDeviceNotification(windows.Handle(h))
问题:如何在Go中获得有效的处理流程?
PS:如果我的问题有任何问题,请告诉我以改善。
答案 0 :(得分:0)
syscall.GetCurrentProcess()可以这样使用。
package main
import (
"fmt"
"syscall"
"unsafe"
)
func main() {
kernel32, err := syscall.LoadDLL("kernel32.dll")
if err != nil {
fmt.Println(err)
}
defer kernel32.Release()
proc, err := kernel32.FindProc("IsWow64Process")
if err != nil {
fmt.Println(err)
}
handle, err := syscall.GetCurrentProcess()
if err != nil {
fmt.Println(err)
}
var result bool
_, _, msg := proc.Call(uintptr(handle), uintptr(unsafe.Pointer(&result)))
fmt.Printf("%v\n", msg)
}