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/ctypes
和 Modules/_ctypes
.
ctypes
什么都不知道。 ctypes
假设 每个符号 都是一个 函数 (即使它是一个变量),它使用 默认参数促销,和returns int
即如果它能正确地与任何东西一起工作,那真是一个奇迹。
我正在开发一种编程语言,我希望它能够访问 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/ctypes
和 Modules/_ctypes
.
ctypes
什么都不知道。 ctypes
假设 每个符号 都是一个 函数 (即使它是一个变量),它使用 默认参数促销,和returns int
即如果它能正确地与任何东西一起工作,那真是一个奇迹。