如何使用命名参数转换typedef回调?

时间:2019-03-28 16:24:37

标签: python-3.x ctypes

所以给了我这样的标题行:

typedef PVOID   (WINAPI *GDIMARSHALLOC)(DWORD dwSize, __in LPVOID pGdiRef);

如何在不调用原型的情况下维护参数名称/标志?

我唯一会做的事情是这样的:

GDIMARSHALLOC = POINTER(CALLBACK(PVOID, DWORD, LPVOID))

请注意,CALLBACK是一个自定义定义,类似于WINFUNCTYPE

1 个答案:

答案 0 :(得分:0)

您可以在实例化CFUNCTYPE / WINFUNCTYPE原型时指定 paramflags ,但不能指定参数名称,但我看不到它对回调有什么帮助,因为它将在您的外部调用代码。

有关{em> paramflags 的讨论,请参见ctypes文档中Function Prototypes的底部。

这是该文档中的一个示例:

>>> from ctypes import c_int, WINFUNCTYPE, windll
>>> from ctypes.wintypes import HWND, LPCWSTR, UINT
>>> prototype = WINFUNCTYPE(c_int, HWND, LPCWSTR, LPCWSTR, UINT)
>>> paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", "Hello from ctypes"), (1, "flags", 0)
>>> MessageBox = prototype(("MessageBoxW", windll.user32), paramflags)
  

现在可以通过以下方式调用MessageBox外部函数:

>>> MessageBox()
>>> MessageBox(text="Spam, spam, spam")
>>> MessageBox(flags=2, text="foo bar")