Python如何知道dll函数的签名

How can Python know the signatures of a dll function

我正在开发一种编程语言,我希望它能够访问 dll(或共享库)。我知道 python 有一个 CDLL 函数可以做到这一点。在 C 中,我知道要调用一个 dll 函数,您必须使用 LoadLibrary 加载库,并使用 GetProcAddress 获取过程,最后将其转换为函数。


typedef void (__stdcall *testf)();

HINSTANCE lib = LoadLibrary("test.dll");
testf proc = (testf) GetProcAddress(lib, "testf");
proc();

但是在python中,第三步没有做。

from ctypes import *

lib = CDLL("test.dll")
lib.testf() #not casting the function anywhere

这是如何完成的,我怎样才能在 C 中实现同样的事情?

ctypes 是猜测。 Python 是动态的 - lib.testf() 导致 python 调用 lib 对象的 __getattriute__ / __getattr__ 方法。该方法由 ctypes 实现,以使用其 python 名称获取函数的入口点。然后,它会为您的 python 代码提供代理,以便为调用编组参数。该代理具有参数实际将成为什么的默认规则。当您调用该函数时,此代理会获取您碰巧传入的任何参数,并再次猜测应如何将这些参数转换为 C。如果默认值不正确,则可以为代理配置一个模式以在 python 和 C。这包含在 docs.

注意:ctypes.

可能很快就会出现严重错误

ctypes有python级和C级代码。您可以在 https://github.com/python/cpython 浏览 cpython 源代码。寻找 Lib/ctypesModules/_ctypes.

ctypes 什么都不知道。 ctypes 假设 每个符号 都是一个 函数 (即使它是一个变量),它使用 默认参数促销,和returns int 即如果它能正确地与任何东西一起工作,那真是一个奇迹。