python--ctypes模块:调用C函数

Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件
Windows 系统下的 C 标准库动态链接文件为 msvcrt.dll (一般在目录 C:\Windows\System32 和 C:\Windows\SysWOW64 下分别对应 32-bit 和 64-bit,使用时不用刻意区分,Python 会选择合适的)
载入动态链接库:
import platform
from ctypes import * #导入模块 if platform.system() == 'Windows':
libc = cdll.LoadLibrary('msvcrt.dll') #载入动态链接库
#Windows 系统下的 C 标准库动态链接文件为 msvcrt.dll
elif platform.system() =='Linux':
libc = cdll.LoadLibrary('libc.so.6')
#Linux 系统下的 C 标准库动态链接文件为 libc.so.6
#下面是加载dll方法:
#stdcall调用约定:两种加载方式 :Objdll = ctypes.windll.LoadLibrary("dllpath")和Objdll = ctypes.WinDLL("dllpath")
#cdecl调用约定:也有两种加载方式:Objdll = ctypes.cdll.LoadLibrary("dllpath")和Objdll = ctypes.CDLL("dllpath")
另外导入dll文件,还有其它方式如下
import platform
from ctypes import * if platform.system() == 'Windows':
libc = cdll.LoadLibrary('msvcrt.dll')
#libc = windll.LoadLibrary('msvcrt.dll') # Windows only
#libc = oledll.LoadLibrary('msvcrt.dll') # Windows only
#libc = pydll.LoadLibrary('msvcrt.dll') #libc = CDLL('msvcrt.dll')
#libc = WinDLL('msvcrt.dll') # Windows only
#libc = OleDLL('msvcrt.dll') # Windows only
#libc = PyDLL('msvcrt.dll')
elif platform.system() =='Linux':
libc = cdll.LoadLibrary('libc.so.6')
#libc = pydll.LoadLibrary('libc.so.6') #libc = CDLL('libc.so.6')
#libc = PyDLL('libc.so.6') libc.printf('Hello ctypes!\n')
ctypes 数据类型
ctypes 作为 Python 和 C 联系的桥梁,它定义了专有的数据类型来衔接这两种编程语言。如下表

注:Python 中的类型,除了 None,int, long, Byte String,Unicode String 作为 C 函数的参数默认提供转换外,其它类型都必须显式提供转换。
None:对应 C 中的 NULL
int, long: 对应 C 中的 int,具体实现时会根据机器字长自动适配。
Byte String:对应 C 中的一个字符串指针 char * ,指向一块内存区域。
Unicode String :对应 C 中一个宽字符串指针 wchar_t *,指向一块内存区域
音量控制:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from lianxi import Ui_Form
from PyQt5.QtCore import Qt
import platform
from ctypes import * #引入ctypes库
import ctypes class Win(QWidget,Ui_Form):
def __init__(self):
super(Win, self).__init__()
self.setupUi(self)
self.setWindowFlag(Qt.MSWindowsFixedSizeDialogHint) # 窗体不能调整大小
self.setWindowTitle('练习') if platform.system() == 'Windows':
libc = cdll.LoadLibrary('msvcrt.dll') else:
exec(0)
self.user32 = ctypes.windll.user32 # 加载user32.dll并返回对象 def lianxi1(self):
APPCOMMAND_VOLUME_UP=0xa0000
APPCOMMAND_VOLUME_DOWN=0x090000
APPCOMMAND_VOLUME_MUTE=0x080000
hwnd = self.user32.GetForegroundWindow() # 获取最前窗口句柄
#self.user32.PostMessageA(hwnd,0x319,0,APPCOMMAND_VOLUME_UP) #增加系统音量2%
#self.user32.PostMessageA(hwnd, 0x319, 0, APPCOMMAND_VOLUME_DOWN) #减小系统音量2%
self.user32.PostMessageA(hwnd, 0x319, 0, APPCOMMAND_VOLUME_MUTE) #系统静音
#第一次静音 第二次还原
#参数4说明:https://technet.microsoft.com/zh-tw/sysinternals/ms646247(v=vs.71) if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Win()
demo.show()
sys.exit(app.exec_())
资料: https://blog.csdn.net/m0_37822019/article/details/79709617

python--ctypes模块:调用C函数的更多相关文章
- 通过实例简介python使用ctypes模块调用C语言动态库
看介绍python语言时,说它是胶水语言,可以调用其他语言.通过使用ctypes模块就可以调用C语言的动态库.下面先放上官方文档和几个比较好的博文. 1.官方文档:http://python.net/ ...
- python常用模块-调用系统命令模块(subprocess)
python常用模块-调用系统命令模块(subprocess) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. subproces基本上就是为了取代os.system和os.spaw ...
- Cortex-M3动态加载三(模块调用系统函数)
在我的arm动态加载实验中需要解决一个模块调用系统函数的问题,可以使用以下的一个方法.将系统函数固定在某一段地址空间,然后导出这一块的符号表到符号文件中,要记载的模块link的时候使用这个符号表文件, ...
- 聊聊Python ctypes 模块(转载)
https://zhuanlan.zhihu.com/p/20152309?columnSlug=python-dev 作者:Jerry Jho链接:https://zhuanlan.zhihu.co ...
- python之模块调用
1.以 atm_run 为入口,在atm中的main模块调用config中的settings from config import settings 2.以atm_run为入口,在main中调用log ...
- Python中模块调用说明
1 import test # 导入test模块 2 3 print(test.a) # 使用"模块.变量"调用模块中的变量 4 5 test.hi() # 使用"模块. ...
- python selenium模块调用浏览器的时候出错
python selenium模块使用出错,这个怎么改 因为不同版本更新不同步问题,浏览器都要另外下一个驱动.
- Python -- 使用模块中的函数
在确定自己不会导入多个同名函数(从不同模块导入)的情况下,你可能不希望在每次调用函数的时候,都要写上模块的名字.那么,可以使用import命令的另外一种形式: >>> from ma ...
- python学习:调用其他函数
vim wc.py #!/usr/bin/python def wordCount(s): chars = len(s) words = len(s.split()) ...
随机推荐
- 【AtCoder】ARC065
ARC065 C - 白昼夢 / Daydream 直接递推就好 #include <bits/stdc++.h> #define fi first #define se second # ...
- MQ解决消息重发--做到幂等性
一.MQ消息发送 1.发送端MQ-client(消息生产者:Producer)将消息发送给MQ-server: 2.MQ-server将消息落地: 3.MQ-server回ACK给MQ-client( ...
- lg 1478
好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...
- 利用Python进行数据分析_Numpy_基础_1
ndarray:多维数组 ndarray 每个数组元素必须是相同类型,每个数组都有shape和dtype对象. shape 表示数组大小 dtype 表示数组数据类型 array 如何创建一个数组? ...
- php curl post请求
/** * CreateBy Song * @param String $url url地址 * @param Array $post url参数 * @return Array */ functio ...
- LocalDate与Date转化
// 01. java.util.Date --> java.time.LocalDateTimepublic void UDateToLocalDateTime() { java.util.D ...
- Path.Combine(
// 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...
- finally代码块的执行
try{ //todo }catch(Exception e){ //todo }finally{ //todo } 1.不管try,catch里面的代码快有无return,finally都会执行 2 ...
- MQTT协议探究(二)
1 回顾与本次目标 1.1 回顾 MQTT控制报文的基本格式 WireShark进行抓包分析了报文 报文分析: CONNECT--连接服务器 CONNACK--确认连接请求 PINGREQ--心跳请求 ...
- MongoDB实战读书笔记(一):JavaScript shell操作MongoDB
1 基本增删改查 基本概念: 数据库:同关系型数据库 集合:类似关系型数据库的表 文档:类似关系型数据库的行 字段:类似关系型数据库的列 操作: insert:新增,若新增数据的主键已经存在,则会抛异 ...