我试图调用user32.dll
的函数RegisterDeviceNotificationW
,但是函数的第一个参数是"接收设备事件的窗口或服务的句柄"(这是我从微软得到的)。
基于云打印机连接器,我尝试使用svc.StatusHandler()
获取处理程序,但对我不起作用,每次运行时我都会收到以下错误:
句柄无效。
我使用sys
的examples的相同代码创建了自己的"服务",用RegisterDeviceNotification
(与google相同的代码)替换了beep
函数,并发送了服务的名称和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)
- 编辑:**我尝试使用GetCurrentProcess,但不起作用:
检索当前进程的伪句柄。
h, err := syscall.GetCurrentProcess()
err = RegisterDeviceNotification(windows.Handle(h))
问题是:* * 如何在Go语言中获得进程的有效句柄?**
如果我的问题有任何问题,请告诉我以改进.
3条答案
按热度按时间hfyxw5xn1#
可以像这样使用syscall.GetCurrentProcess()。
dsekswqp2#
gstyhher3#
这是我不久前写的一些代码来处理这个问题,上次我检查的时候它还在工作。我已经为一堆winapi调用创建了 Package 函数。
我希望这些评论足以让你度过难关,如果你有任何问题,请告诉我。
确保在使用完句柄后将其关闭,不希望无限期地保持随机句柄打开。
以下是一些资源,可以帮助您了解正在发生的事情:
https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
https://learn.microsoft.com/en-us/windows/win32/procthread/process-security-and-access-rights