如何解决Python如何知道dll函数的签名
我正在开发一种编程语言,并且我希望它能够访问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
假定每个符号是函数(即使它是一个变量),它使用默认参数提升和返回int
即如果所有功能都能正常使用,这真是一个奇迹。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。