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  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM