- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用Go的syscall程序包来调用用C++编写的DLL。
C++方法签名看起来像这样。init(int* buffer, int argc, char* argv[], const char* fileName, const char* key, const char* prefix, const char* version)
这是我用来在Go中调用上述方法的函数。
func init(
buffer uintptr,
argsCount int,
args []string,
fileName string,
key string,
prefix string,
version string
) uintptr {
// libHandle is handle to the loaded DLL
methodAddress := getProcAddress(libHandle, "init")
status, _, err := syscall.Syscall9(
methodAddress,
7,
buffer,
uintptr(unsafe.Pointer(&argsCount)),
uintptr(unsafe.Pointer(&args)),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(fileName))),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(key))),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(prefix))),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(version))),
0,
0)
fmt.Println(err.Error())
return status
}
Exception 0xc0000005 0x0 0x0 0x7fffe30bdb33
PC=0x7fffe30bdb33
syscall.Syscall9(0x7fffe32db600, 0x7, 0x97db50, 0xc00007ff10,
0xc00007ff70, 0xc000054180, 0xc0000541a0, 0xc0000541c0, 0xc0000541e0,
0x0, ...)
c:/go/src/runtime/syscall_windows.go:210 +0xf3
main.main()
E:/Path/test.go:157 +0x2be
rax 0x81fbf0
rbx 0x1
rcx 0x7ff804ad1310
rdi 0x7ff10
rsi 0xc00007ff70
rbp 0x0
rsp 0x81fbc0
r8 0x0
r9 0x7ff804ad0000
r10 0xc00007ff00
r11 0x81fbf0
r12 0x7ff10
r13 0xc00007ff70
r14 0xc000054180
r15 0x97db50
rip 0x7fffe30bdb33
rflags 0x10257
cs 0x33
fs 0x53
gs 0x2b
最佳答案
那个设定
所以,基本上,您得到的映射是
int* buffer
→buffer uintptr
int argc
→unsafe.Pointer(&argsCount)
,其中&argsCount
是指向int
的指针char* argv[]
→unsafe.Pointer(&args)
,其中args
是[]string
const char* fileName
→unsafe.Pointer(syscall.StringToUTF16Ptr(fileName))
const char* key
,const char* prefix
,const char* version
-与上述相同。uintptr
值。 (稍后对此有更多介绍。)argsCount
函数参数的地址传递给argc
。如果将其解释为计数,那么在典型的商品平台/操作系统(例如amd64/Windows)上的地址就是一个巨大的值(value)。argv
中读取许多元素时会崩溃—导致其读取您的进程未映射的内存。struct
:基础数据数组的地址,该数组中允许使用的元素数以及在 slice 值上调用时,append
函数可在不重新分配的情况下使用该数组中此类元素的总数。args []string
并执行&args
时,您将获得该结构的地址,而不是该 slice 的第一个元素的地址。&args[0]
。char *
时要处理的内容。argv
构造一个合适的东西,argv := make([]unsafe.Pointer, 0, len(args))
for i, s := range args {
argv[i] = unsafe.Pointer(syscall.StringToUTF16Ptr(s))
}
然后将&argv[0]
传递给被调用者。syscall.StringToUTF16Ptr()
。const char*
类型的其余参数的准备工作似乎是正确的,但前提是被叫方确实表示其char
是16位整数。char
实际上是 wchar_t
or WCHAR
。uintptr
的说明
unsafe.Pointer
值算作对存储块的正确引用,但
uintptr
值
不算。 这意味着当代码
p := new(someType)
u := uintptr(unsafe.Pointer(&p))
foo(u)
return
在运行时,一旦分配了
p
地址,GC便可以随意回收
p
分配的对象-这是因为
p
是对该对象的唯一引用,而
u
不是。
foo
运行时,可能也会执行GC,并且可能会从
someType
的脚下扫掠
foo
实例。
uintptr(unsafe.Pointer)
类型转换均不受GC的影响。因此,以我们之前的示例为例,就可以了
foo(uintptr(unsafe.Pointer(new(someType)))
return
和
p := new(someType)
v := unsafe.Pointer(&p)
foo(uintptr(v))
return
因为将类型转换为
uintptr
的过程是在单个表达式中进行的-这是一个函数调用。
uintptr
。
关于c++ - 调用Syscall函数时获取异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56755969/
我正在阅读 syscall 包中的源代码,遇到了一些问题: 因为我对syscall 和assembly 完全是个菜鸟,所以不要犹豫,分享你所知道的一切:) 首先关于 func RawSyscall(t
我在一台机器上运行Docker镜像时看到以下错误 uname -r 3.10.0-229.7.2.el7.x86_64 2016/11/01 23:46:56 Error resolving sysc
不推荐使用 syscall 软件包。假设我有以下代码,希望将其迁移到不推荐使用的代码中: someGoObject := &struct{int; float32}{5, 45.4} syscall.
我正在尝试使用 VkKeyScan来自 Window 的 API,但是只要调用该函数,程序就会崩溃。我以这种方式导入和使用的其他 Window API 函数没有问题。我的 syscall.Syscal
在研究我的另一个问题时Go package syscall conn.Read() is non-blocking and cause high CPU usage , 我阅读了 syscall 包中
在 Windows 上使用 go 我有一个名为 sock 的 syscall.Handle,我想将其绑定(bind)到名为“sa”的 syscall.Sockaddr 结构中指定的地址。 如何填写 s
谁能告诉我为什么 syscall.Kill(pid, syscall.SIGSEGV) 只打印一次 "handlerSIGSEGV Sent by 0" ,但是 mustSendSIGSEGV 会打印
当我尝试在 Ubuntu 机器中启用 PPP 时,在 menuconfig 之后发生以下错误并尝试制作内核: $ sudo make make[1]: *** No rule to make targ
当我尝试在 Ubuntu 机器中启用 PPP 时,在 menuconfig 和尝试制作内核之后发生了以下错误: $ sudo make make[1]: *** No rule to make tar
我一直在尝试Go和Win32,发现了用于调用OS函数的以下两种变体(代码缩写): modUser32 = syscall.NewLazyDLL("user32.dll") procMessageBox
源代码是here 我对我的理解发表了评论 type mmapper struct { sync.Mutex active map[*byte][]byte // active mapp
这个问题在这里已经有了答案: What does a function without body mean? (1 个回答) 3年前关闭。 谁能解释一下 Go 标准库中 syscall 包中的以下代码
我目前正在尝试在 Go 上使用 user32.dll EnumWindows,但似乎无法正常工作 var( user32 = syscall.NewLazyDLL("user32.dll")
我的代码包括对 _write() 和 _sbrk() 等函数的间接调用。在项目中,我有一个名为 syscalls.c 的文件,它定义了我对这些函数的自定义实现,编译器/链接器找到了这个文件,并在我运行
我是新来的,目前正在尝试了解同事编写的一些代码 go func() { s := <-sigs if s == syscall.SIGURG { fmt.Println
我试图了解Golangs syscall软件包的一些底层细节。特别是,我对特定于Windows的系统调用感兴趣(请参见下面的示例)。 我可以找到基于UNIX的系统的syscall.Syscall()的
我有两个运行的过程,用Go语言编写,其中一个(sender.go)将消息发送到另一个(listener.go),同时通过websocket陷入for循环中。 问题是listener.go仅在终止循环后
有syscall它允许在 Linux 中进行间接系统调用。使用它的原因是什么 - 为什么它比直接调用函数更好? 最佳答案 有时内核会添加系统调用,C 库需要一段时间才能支持它们。 或者您可能正在旧的
您好 使用tkill() linux 内核调用向进程的每个线程发送信号 是否安全?因为它没有直接公开,所以我使用 syscall() 调用它。 我指的是链接 - . 但我不知道我是否应该在调用之前进行
当我创建模块时,它会发出此警告,并且会构建稍后的模块。但是如果没有实现我自己的系统调用“mycall”,构建模块有什么用 root@akshit-Vostro-1550:~/Desktop/Devic
我是一名优秀的程序员,十分优秀!