python内置库之学习ctypes库(二)

Alt

一.自己实现一个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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce-li__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值