一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰
1.下载MinGW-w64
#下载地址https://sourceforge.net/projects/mingw-w64/
如果安装的是32位的gcc,默认编译的dll文件为32位的
如果安装的是64位的gcc,默认编译的dll文件为64位的(建议安装64位的)
安装的时候
Version选择当前支持的最高版本。
Architecture:由于我的是win10 64位,因此选择了x86_64。如果是32位电脑,需要选择i686。
Threads:这个世界上只有两种操作系统,符合 posix 协议的,和 Windows 。如果你想要开发 Windows 程序,需要选择 win32 ,
而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。我只开发在 Windows 下运行的程序,所以选择了 win32 。
Exception:异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,
seh 是新发明的,而 sjlj 则是古老的。
seh 性能比较好,但不支持 32位。
sjlj 稳定性好,支持 32位。 我这里选择了 sjlj。
如果之前架构选择的是i686,则选项是 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,他们都不支持 64位 。
Build revision:使用默认值。
在MinGW-w64/bin目录下运行cmd黑窗
常用gcc命令
#查看gcc版本信息
gcc -v
#生成64位的dll文件
gcc --shared -o test64.dll test.c
#生成32位的dll文件
gcc --shared -o test.dll test.c -m32
#生成可执行文件(.exe文件)
gcc test.c -o test
-shared: 表明产生共享库
-o:指定生成可执行文件的名称
-m32:生成32位的文件
最好配置到环境变量,方便后期使用
二.生成dll文件
新建test.c文件
添加以下内容
#include <stdio.h>
int max(int num1, int num2);
int main()
{
/* 我的第一个 C 程序 */
printf("Hello, World! \n");
return 0;
}
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
使用命令gcc --shared -o test64.dll test.c
gcc --shared -o test.dll test.c -m32
生成32位的dll和64位的dll文件
三.ctypes库调用
用ctypes库去调用dll文件
import ctypes
import time
dll=ctypes.WinDLL('./test.dll')
while True:
res = dll.main()
res1= dll.max(ctypes.c_int(2),ctypes.c_int(2))
print("res", res)
print("res1",res1)
time.sleep(1)
用python64位解释器调用32位的dll文件报以下错误:
#[WinError 193] %1 不是有效的 Win32 应用程序!
应该调64位的dll文件才不会有报错
import ctypes
import time
dll=ctypes.WinDLL('./test64.dll')
while True:
res = dll.main()
res1= dll.max(ctypes.c_int(2),ctypes.c_int(2))
print("res", res)
print("res1",res1)
time.sleep(1)