Python ctypes函数ptr作为c_void_p

Python ctypes函数ptr作为c_void_p,python,ctypes,Python,Ctypes,使用ctypes(python3),我试图转换一个\u FuncPtr对象,它应该是一个标识符或c\u void\u p类型 但是使用cast会产生错误的地址,而在_dll中使用会产生正确的地址 在下面的代码中,使用p1会导致SEGFULT,而p2会正常工作。 这是为什么?如何正确地将\u FuncPtr转换为c\u void\p windows=CGWindowListCopyWindowInfo(kcgwindowlistoptional,kCGNullWindowID) 对于cfarray

使用ctypes(python3),我试图转换一个
\u FuncPtr
对象,它应该是一个标识符或
c\u void\u p
类型

但是使用
cast
会产生错误的地址,而在_dll中使用
会产生正确的地址

在下面的代码中,使用
p1
会导致SEGFULT,而
p2
会正常工作。 这是为什么?如何正确地将
\u FuncPtr
转换为
c\u void\p

windows=CGWindowListCopyWindowInfo(kcgwindowlistoptional,kCGNullWindowID)
对于cfarray(windows)中的_win:
打印(_-win)
p1=铸造(Q.kCGWindowNumber,c\U void\U p)
p2=c_void_p.in_dll(Q,“kCGWindowNumber”)
pid=CFYGetValue(_win,p2)
打印(pid)

Q.kCGWindowNumber
包含符号地址,但您需要实际位于该地址的
void*
指针,因此,如果出于某种原因无法在_dll中使用
,则使用
cast(Q.kCGWindowNumber,指针(c\u void\u p)).contents
指针(c\kcu void\p.)。从_缓冲区(Q.gwindownumber).contents
在_dll中运行,但您的第一个解决方案是cleaner=)谢谢!如果你想,把它作为一个答案发布,这样我就可以+1它了。使用来自缓冲区的
可能看起来不那么干净,但实际上实现要简单得多
cast
是使用FFI调用实现的,需要进行大量的设置工作。当然,除非您处于一个紧密的循环中,否则微小的差异并不是什么大不了的。“clean”-ness是指_dll
中的
,谢谢,_buffer
版本的
工作得很好!