python ctypes 调用 dll动态库小结

搞了半天,终于调用成功了,顺利把cpp文件编译成可被ctypes调用的dll文件,顺利在python中执行了dll里的函数。之前对windows的dll完全不熟悉,只知道它是windows的动态库文件,借着这次机会也稍微把它熟悉了一下。

第一:生成可被调用的dll文件

刚开始想使用cygwin生成dll文件,可是生成的dll文件每次在python中报”[153]不是有效的win32“错误,上网上查了下都说是win64位和32位不兼容的问题,然后我把python版本和cygwin版本统一了一下,还是报这个错误,然后查了资料也没有头绪。最后果断放弃Cygwin,使用visual studio的编译器cl生成可执行的dll文件,指令为:

cl /LD file.cpp

然后就在python中执行ctypes.windll.LoadLibrary('*.dll')不报错啦。

第二:在python中执行dll里的函数:
load成功后调用函数又报,no function found 错误,唉,真是好事多磨。查了半天资料,发现windows dll文件可以,使用 

link /dump /exports *.dll

查看可被调用的函数。然后我自己生成的dll里居然没有那个我要调用的函数,要在函数加extern __declspec(dllexport)前缀才可以exports,唉,都是对dll不了解的原因。

第三:在python中执行后,报错

ValueError: Procedure probably called with too many arguments (4 bytes in excess),发现我把可以犯的错误都给犯了,看了一下ctypes官方文档,原来是dll模块使用的不对,对于我的dll要用cdll,可是我用的是windll,所以我的函数虽说执行了, 可还是报错啦。


 

展开阅读全文

没有更多推荐了,返回首页