Python 打破次元壁:畅连 DLL

通过python直接调用dll。包括对指针的传递以及返回的处理。直接用即可。

import ctypes

WORD = ctypes.c_ushort
LONG = ctypes.c_long
DWORD = ctypes.c_ulong
BYTE = ctypes.c_ubyte

class ImageCaptureLib:
    # ImageCaptureLib.dll path
    def __init__(self, path):
        try:
            self.image_capture_lib = ctypes.windll.LoadLibrary(path)
        except Exception as e :
            print(f"IMAGECAPTURELIB.dll load error: {e}")

    def Open(self, wVendor, wProduct):
        self.image_capture_lib.ImageCaptureLib_Open.argtypes = [WORD, WORD]
        self.image_capture_lib.ImageCaptureLib_Open.restype = LONG

        # Parameter
        # wVendor = 0x1234
        # wProduct = 0x5678

        # dll提供的api
        result = self.image_capture_lib.ImageCaptureLib_Open(wVendor, wProduct)
        return result

    def Close(self):
        result = self.image_capture_lib.ImageCaptureLib_Close()
        return result

    def GetVersion(self, version):
        self.image_capture_lib.ImageCaptureLib_GetVersion.argtypes = [ctypes.POINTER(DWORD)]
        self.image_capture_lib.ImageCaptureLib_GetVersion.restype = LONG

        # Parameter
        # version = DWORD()

        result = self.image_capture_lib.ImageCaptureLib_GetVersion(ctypes.byref(version))
        return result

    def ReadRegister(self, bSlave, wAddress, bSize, pbData):
        self.image_capture_lib.ImageCaptureLib_ReadRegister.argtypes = [BYTE, WORD, ctypes.POINTER(BYTE), BYTE]
        self.image_capture_lib.ImageCaptureLib_ReadRegister.restype = LONG

        # Parameter
        # bSlave = BYTE(0x01)
        # wAddress = WORD(0x1234)
        # bSize = BYTE(10)
        # pbData = (BYTE * int(bSize.value))()
    
        result = self.image_capture_lib.ImageCaptureLib_ReadRegister(bSlave, wAddress, pbData, bSize)
        return result

    def WriteRegister(self, bSlave, wAddress, pbData, bSize):
        self.image_capture_lib.ImageCaptureLib_WriteRegister.argtypes = [BYTE, WORD, ctypes.POINTER(BYTE), BYTE]
        self.image_capture_lib.ImageCaptureLib_WriteRegister.restype = LONG

        # Parameter
        # bSlave = BYTE(0x02)
        # wAddress = WORD(0x3000)
        # data_to_write = [0x11, 0x22, 0x33, 0x44, 0x55]
        # bSize = BYTE(len(data_to_write))
        # pbData = (BYTE * int(bSize.value))(*data_to_write)

        result = self.image_capture_lib.ImageCaptureLib_WriteRegister(bSlave, wAddress, pbData, bSize)
        return result

    def GetFrame(self, pbFrame, pdwSize, dwTimeout):
        self.image_capture_lib.ImageCaptureLib_GetFrame.argtypes = [ctypes.POINTER(BYTE), ctypes.POINTER(DWORD), DWORD]
        self.image_capture_lib.ImageCaptureLib_GetFrame.restype = LONG

        # Parameter
        # max_frame_size = 1024 * 1024
        # pbFrame = (BYTE * max_frame_size)()
        # pdwSize = DWORD()
        # dwTimeout = DWORD(1000)

        result = self.image_capture_lib.ImageCaptureLib_GetFrame(pbFrame, ctypes.byref(pdwSize), dwTimeout)
        return result

if  __name__ == "__main__":
    icl = ImageCaptureLib("./libImage.dll")
    # Parameter
    # max_frame_size = 641 * 646
    # pbFrame = (BYTE * max_frame_size)()
    # pdwSize = DWORD()
    # dwTimeout = DWORD(1000)
    # icl.GetFrame(pbFrame, pdwSize, dwTimeout)
    # print(pbFrame)
    #  icl = ImageCaptureLib("./IMAGECAPTURELIB.dll")
    #  version = DWORD()
    #  icl.GetVersion(version)
    #  print(version)
    #  print(f"Version: 0x{version.value:X}")  # Display version in hexadecimal format
    #  version_bytes = (version.value).to_bytes(4, byteorder='little')
    #  for i, byte in enumerate(version_bytes):
    #     print(f"Byte {i}: 0x{byte:02X}")

    #  # Parameter
    #  bSlave = BYTE(0x01)
    #  wAddress = WORD(0x0142)
    #  bSize = BYTE(4)
    #  pbData = (BYTE * int(bSize.value))()
    #  icl.ReadRegister(bSlave, wAddress, bSize, pbData)
    
    #  horizontal = pbData[0] | (pbData[1] << 8)
    #  vertical = pbData[2] | (pbData[3] << 8)
    #  print(horizontal)
    #  print(vertical)
    #  horizontal = pbData[0] | (pbData[1] << 8)
    #  vertical = pbData[2] | (pbData[3] << 8)
    #  print(f"Horizontal: {horizontal} pixels")
    #  print(f"Vertical: {vertical} pixels")
    #  # Parameter
    #  bSlave = BYTE(0x02)
    #  wAddress = WORD(0x3000)
    #  data_to_write = [0x11, 0x22, 0x33, 0x44, 0x55]
    #  bSize = BYTE(len(data_to_write))
    #  pbData = (BYTE * int(bSize.value))(*data_to_write)
    #  icl.WriteRegister(bSlave, wAddress, pbData, bSize)

还有一种方式就是通过pyd,在c++侧来进行调用。那种方式更好,要根据具体的场景来定。如果有很多状态在c++代码里面设置,而调用的时候又需要这些状态,那就应该写在C++侧。

更多内容,欢迎关注我的微信公众号: 半夏之夜的无情剑客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

helloworddm

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

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

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

打赏作者

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

抵扣说明:

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

余额充值