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()) ...
随机推荐
- linux 下tomcat出现 Native memory allocation (malloc) failed to allocate 1915224064 bytes for committing reserved memory问题
## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocat ...
- Hadoop介绍与安装
前言 最近想学习下大数据,有点急于求成,于是去网上找了各种培训机构的视频,发现大都质量不佳,理论基本不说或者简单讲下,然后教你照猫画虎的敲代码,出了问题都没法分析.最后还是找了厦门大学的公开课从理论开 ...
- SSM框架的整合与使用——实现简单的转账系统
一.整合思路 SSM框架即SpringMVC + Spring + MyBati框架集,是一种轻量级的Web开源框架.它们各自在JAVA三层架构中负责的模块如下图所示: 其中,SpringMVC与Sp ...
- vue开发环境配置跨域,一步到位
本文要实现的是:使用vue-cli搭建的项目在开发时配置跨域,上线后不做任何任何修改,接口也可以访问,前端跨域解决方案 production:产品 生产环境 development:开发 开发环境 1 ...
- Linux下一种高效多定时器实现
Linux下一种高效多定时器实现 作者:LouisozZ 日期:2018.08.29 运行环境说明 由于在 Linux 系统下一个进程只能设置一个时钟定时器,所以当应用需要有多个定时器来共同管理程序运 ...
- django API返回中文乱码
renturn HttpResponse(json.dumps(data,ensure_ascii=False))
- VS219 没有.net core 3.0模板
控制台命令 dotnet --info dotnet --version 都正常显示有安装3.0 需要升级VS 2019 16.3.3,本地版本为16.3.2
- SpringBoot 异步调用方法并接收返回值
项目中肯定会遇到异步调用其他方法的场景,比如有个计算过程,需要计算很多个指标的值,但是每个指标计算的效率快慢不同,如果采用同步执行的方式,运行这一个过程的时间是计算所有指标的时间之和.比如: 方法A: ...
- JS基础_实参可以是任何值
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- java-操作string的常用语法
1.Java判断String是否以某个字符串开头: String mobile = "8618730600000";System.out.println(mobile.starts ...