如何在Python中使用ctypes加载DLL?
请给我一个示例,说明如何在Python中加载和调用C++的DLL中的函数?
我看到一些文章说我们可以使用“ctypes”来加载和调用DLL中的函数,但我找不到一个能正常工作的示例。
如果有人能提供一个示例,那就太好了。
1 个回答
6
这里有一些我在项目中用来加载DLL(动态链接库)、查找函数并设置和调用该函数的实际代码。
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call
# in the DLL, `HLLAPI()` (the high-level language API). This
# particular function returns an `int` and takes four `void *`
# arguments.
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int,
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p)
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0)
# Actually map the DLL function to a Python name `hllApi`.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function. Set up the
# variables to pass in, then call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p ("Z")
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
在这个例子中,函数来自一个终端模拟器包,它非常简单——它需要四个参数,但不返回值(实际上有一些值是通过指针参数返回的)。第一个参数(1)是用来表示我们想要连接到主机。
第二个参数("Z")是会话ID。这个特定的终端模拟器允许使用"A"到"Z"的短名称会话。
另外两个参数分别是一个长度和一个我现在记不起来用途的字节(我应该把那段代码写得更清楚一些)。
具体步骤是:
- 加载DLL。
- 设置函数的原型和参数。
- 将其映射到一个Python名称(方便调用)。
- 创建必要的参数。
- 调用这个函数。
ctypes库包含了所有C语言的数据类型(比如int
、char
、short
、void*
等等),可以通过值或引用传递参数。这里有一个教程,详细介绍了如何使用它,链接在这里。