通过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++侧。
更多内容,欢迎关注我的微信公众号: 半夏之夜的无情剑客