- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这是我第一次不得不从 Go 调用本地库。
我正在尝试使用 Windows 库设置事件 Hook 以监听网络接口(interface)更改,到目前为止,我已经成功地使用 NotifyAddrChange
设置了一个监听器。 .
现在我正在尝试使用 NotifyIpInterfaceChange
和以下代码
package main
import (
"golang.org/x/sys/windows"
"log"
"syscall"
"unsafe"
)
var (
modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll")
procNotifyIpInterfaceChange = modiphlpapi.NewProc("NotifyIpInterfaceChange")
)
type context struct{}
func main() {
log.Printf("Loaded [iphlpapi.dll] at {%#v}", modiphlpapi.Handle())
log.Printf("Found [NotifyIpInterfaceChange] at {%#v}", procNotifyIpInterfaceChange.Addr())
context := &context{}
interfaceChange := windows.Handle(0)
ret, _, errNum := procNotifyIpInterfaceChange.Call(syscall.AF_UNSPEC, syscall.NewCallback(callback), uintptr(unsafe.Pointer(context)), 0, uintptr(interfaceChange))
log.Printf("%#v %#v", ret, errNum)
}
func callback(callerContext, row, notificationType uintptr) uintptr {
log.Printf("callback invoked by Windows API (%#v %#v %#v)", callerContext, row, notificationType)
return 0
}
代码编译正常并且启动没有任何问题,一旦调用函数就会出现问题,然后我得到以下异常
D:\>event-listen_type2.exe
2017/06/22 22:12:39 Loaded [iphlpapi.dll] at {0x7ffac96f0000}
2017/06/22 22:12:39 Found [NotifyIpInterfaceChange] at {0x7ffac96f7e20}
Exception 0xc0000005 0x1 0x0 0x7ffac96f7edb
PC=0x7ffac96f7edb
syscall.Syscall6(0x7ffac96f7e20, 0x5, 0x0, 0x454170, 0x54d360, 0x0, 0x0, 0x0, 0xc042015350, 0xc042015300, ...)
/usr/local/Cellar/go/1.8.3/libexec/src/runtime/syscall_windows.go:174 +0x6b
github.com/LiamHaworth/windows-network-events/vendor/golang.org/x/sys/windows.(*Proc).Call(0xc04203a620, 0xc042050300, 0x5, 0x5, 0x30, 0x4b12e0, 0x1, 0xc042050300)
/Users/liam/git/go_path/src/github.com/LiamHaworth/windows-network-events/vendor/golang.org/x/sys/windows/dll_windows.go:139 +0x5c1
github.com/LiamHaworth/windows-network-events/vendor/golang.org/x/sys/windows.(*LazyProc).Call(0xc042050270, 0xc042050300, 0x5, 0x5, 0x1, 0xc04201a000, 0xc04202df78, 0x4043a3)
/Users/liam/git/go_path/src/github.com/LiamHaworth/windows-network-events/vendor/golang.org/x/sys/windows/dll_windows.go:309 +0x66
main.main()
/Users/liam/git/go_path/src/github.com/LiamHaworth/windows-network-events/main_windows.go:25 +0x229
rax 0x0
rbx 0xc3f10
rcx 0x1fb5cd87abfd0000
rdi 0x0
rsi 0x454170
rbp 0xc04202dc00
rsp 0x8fdf0
r8 0x8fb78
r9 0x7ffac96fb4c0
r10 0x0
r11 0x8fcf0
r12 0x0
r13 0xffffffee
r14 0x0
r15 0xaa
rip 0x7ffac96f7edb
rflags 0x10246
cs 0x33
fs 0x53
gs 0x2b
通过谷歌搜索,我知道异常类型 0xc0000005
是当程序试图访问未分配给它的内存时由 CPU 抛出的访问冲突,但通过查看我的代码我无法判断它在哪里正在发生。传递的所有指针都是针对应用程序中的项目。
这里的任何帮助都会很棒。
最佳答案
根据文档,NotifyIpInterfaceChange的最新参数是 in/out
并且需要是指向 HANDLE
的指针。将系统调用更改为:
ret, _, errNum := procNotifyIpInterfaceChange.Call(syscall.AF_UNSPEC,
syscall.NewCallback(callback),
uintptr(unsafe.Pointer(context)),
0,
uintptr(unsafe.Pointer(&interfaceChange))) //this must be pointer
编辑:
正如评论中提到的和this go-nuts discussion ,对于多线程回调,需要添加import "C"
,即使我们不使用cgo
。
关于windows - 从 Go 调用 NotifyIpInterfaceChange 导致访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44699710/
这是我第一次不得不从 Go 调用本地库。 我正在尝试使用 Windows 库设置事件 Hook 以监听网络接口(interface)更改,到目前为止,我已经成功地使用 NotifyAddrChange
我需要捕获网络接口(interface)更改,即基于 C++ 的 Windows 服务中的网络连接/断开事件。Windows API 函数 NotifyIpInterfaceChange () 确实捕
我是一名优秀的程序员,十分优秀!