我正在尝试使用python的ctypes与this DLL对话。许多功能采取或返回HGRABBER
类型:我正确使用ctypes来pythonify这个结构?
typedef struct HGRABBER_t__ { int unused; } HGRABBER_t;
#define HGRABBER HGRABBER_t*
(完整的头文件可以被看作here)。这里有一个函数原型,返回HGRABBER
类型的例子:
HGRABBER __stdcall IC_CreateGrabber();
这是我尝试在实施这一结构在Python中,并用它来调用从DLL,它的功能:
import ctypes as C
class GrabberHandle(C.Structure):
_fields_ = [('unused', C.c_int)]
dll = C.windll.LoadLibrary('tisgrabber_x64.dll')
dll.create_grabber = dll.IC_CreateGrabber
dll.create_grabber.argtypes = []
dll.create_grabber.restype = GrabberHandle
my_handle = dll.create_grabber()
这似乎去工作,但我担心我做错了。我对C没有经验,我不认为我理解定义HGRABBER
类型的语句typedef
和#define
。 我正确拨打IC_CreateGrabber
吗?我是否应该将GrabberHandle定义为一个指向结构体的指针,而不是结构体?
感谢您的阅读,请让我知道,如果我能澄清我的问题莫名其妙。
你的回答对我来说似乎是正确的,但另一个答案与你相矛盾。通常我可以通过运行代码来判断谁是正确的,但是这次看起来不是这样,因为你提到的原因(以后不会崩溃)。有没有办法证明哪个答案是正确的,还是我应该在这里和我一起去? – Andrew 2014-09-14 22:30:31
@Andrew,未使用的'int'是不必要的。重要的是指针中的地址,这可能是一个C++对象。将结果设置为4字节结构在64位系统上是错误的;截断指针地址。你可以使用'c_void_p',但为了更好的类型安全性,使用指向结构体的指针。你不需要定义'_fields_'。你可以使用'HGRABBER = POINTER(type('HGRABBER',(Structure,),{}))'。 – eryksun 2014-09-15 05:47:58
@eryksun:关于使用指向空结构的指针来表示Win32 API中经常使用的“不透明句柄”的好建议。 – abarnert 2014-09-15 17:39:54