龙空技术网

python3中ctypes的动态链接库

鸭绿江战士 56

前言:

此刻咱们对“python 调用动态链接库”大约比较重视,朋友们都需要了解一些“python 调用动态链接库”的相关内容。那么小编在网摘上网罗了一些有关“python 调用动态链接库””的相关文章,希望各位老铁们能喜欢,大家一起来了解一下吧!

ctypes 提供了3种方法调用动态链接库:cdll(), windll(), 和 oledll()。它们的不同之处就在于,函数的调用方法和返回值。cdll() 加载的库,其导出的函数必须使用标准的 cdecl 调用约定。windll()方法加载的库,其导出的函数必须使用 stdcall 调用约定(Win32 API 的原生约定)。oledll()方法和 windll()类似,不过如果函数返回一个 HRESULT 错误代码,可以使用 COM 函数得到具体的错误信息,oledll在阅读过程中没深入了解,有兴趣的读者可以自行了解以下。

调用约定

调用约定专指函数的调用方法。其中包括,函数参数的传递方法,顺序(压入栈或者传给寄存器),以及函数返回时,栈的平衡处理。下面这两种约定是我们最常用到的: cdecl和stdcall。cdecl 调用约定,函数的参数从右往左依次压入栈内,函数的调用者在函数执行完成后负责函数的平衡。这种约定常用于 x86 架构的 C 语言里。

int python_rocks(reason_one, reason_two, reason_three);push reason_three push reason_two push reason_one call python_rocks add esp, 12

从上面的汇编代码中,可以清晰的看出参数的传递顺序,最后一行,栈指针增加了 12 个字节(三个参数传递个函数,每个被压入栈的指针都占 4 个字节,共 12 个),使得函数调用之后的栈指针恢复到调用前的位置。

下面是个 stdcall 调用约定的了例子,用于 Win32 API。

int my_socks(color_one color_two, color_three);push color_three push color_two push color_onecall my_socks

这个例子里,参数传递的顺序也是从右到左,不过栈的平衡处理由函数 my_socks 自己完成,而不是调用者。 最后一点,这两种调用方式的返回值都存储在 EAX 中。

libwm = windll.msvcrtlibcm = cdll.msvcrtlibwk = windll.kernel32libck = cdll.kernel32

windll和cdll都是通过 from ctypes import * 导入的。

标签: #python 调用动态链接库 #python动态链接库在哪里