Python 2.7.8, Windows 7, Phyton USB programmer's DLL
我坚持使用数据元素,它应该是一个大的内存数组,我尝试使用几种不同的定义,但我无法理解错误试图告诉我什么。 我遇到的大多数错误都是类型错误,下面的这段代码是我最接近的代码,它似乎在调用函数,但由于错误而无法处理。
C 接口:
typedef struct tagACI_Memory_Params
{
UINT Size; // (in) Size of structure, in bytes
UINT BufferNumber; // (in) Number of buffer of interest, the first buffer number is 0
UINT LayerNumber; // (in) Number of layer of interest, the first layer number is 0
DWORD AddressLow; // (in) Low 32 bits of address, in layer units (natural to device address)
DWORD AddressHigh; // (in) High 32 bits of address, in layer units (natural to device address)
PVOID Data; // (in || out) Pointer to data to read to or write from
DWORD DataSize; // (in) Size of data to read or write, in layer units, max. 16 MB (0x1000000)
DWORD FillValue; // (in) Value to fill buffer with, used by ACI_FillLayer() only
} ACI_Memory_Params;
我的蟒蛇代码:
MaxMemorySize = 1024
MemoryBuffer = ctypes.c_ubyte * MaxMemorySize
class Memory_Params(ctypes.Structure):
_fields_ = [("Size", ctypes.wintypes.UINT),
("BufferNumber", ctypes.wintypes.UINT),
("LayerNumber", ctypes.wintypes.UINT),
("AddressLow", ctypes.wintypes.DWORD),
("AddressHigh", ctypes.wintypes.DWORD),
("Data", MemoryBuffer ),
("DataSize", ctypes.wintypes.DWORD),
("FillValue", ctypes.wintypes.DWORD)
]
WriteLayer = ctypes.windll.ACI.ACI_WriteLayer
WriteLayer.argtypes = [ctypes.POINTER(Memory_Params)]
WriteLayer.restype = ctypes.HRESULT
WData = Memory_Params(ctypes.sizeof(Memory_Params),0,0,0,0,ctypes.POINTER(MemoryBuffer),15,0)
for i in range(10):
WData.Data[i] = i
print 'write result', WriteLayer(ctypes.byref(WData))
API 调用返回一个 1,这意味着:定义 ACI_ERR_INVALID_PARAMS_SIZE 1//ACI 函数中的结构大小无效
更新:我错过的关键事情:在定义 MemoryBuffer 对象后创建和使用它,以及如何正确定义指针。如果其他人有类似的情况,这里是工作代码:
MaxMemorySize = 1024
MemoryBuffer = ctypes.c_ubyte * MaxMemorySize
class Memory_Params(ctypes.Structure):
_fields_ = [("Size", ctypes.wintypes.UINT),
("BufferNumber", ctypes.wintypes.UINT),
("LayerNumber", ctypes.wintypes.UINT),
("AddressLow", ctypes.wintypes.DWORD),
("AddressHigh", ctypes.wintypes.DWORD),
("Data", ctypes.POINTER(ctypes.c_ubyte) ),
("DataSize", ctypes.wintypes.DWORD),
("FillValue", ctypes.wintypes.DWORD)
]
WriteLayer = ctypes.windll.ACI.ACI_WriteLayer
WriteLayer.argtypes = [ctypes.POINTER(Memory_Params)]
WriteLayer.restype = ctypes.wintypes.UINT
PData = MemoryBuffer()
WData = Memory_Params(ctypes.sizeof(Memory_Params),0,0,0,0,PData,for i in range(10):
PData[i] = i
WriteLayer(ctypes.byref(WData))
- 初始化 WData 对象时,第 6 个参数是 ctypes。指针(内存缓冲区)。这是(或应该是语法上)不正确的:POINTER 返回一个指针类型,而你需要一个无符号的 char 数组(它是一个对象或类型的实例)
- 你得到的大小错误是因为Python结构与C结构不匹配。C 中的 Data 成员是一个 PVOID,它是一个大小为 8 的指针(如果你有一个 32 位 Python 或 4),而在 Python 中,它有一个大小为 1024 的 MemoryBuffer 类型 。
若要更正此问题,请将 Memory_Params.Data 成员的类型设置为:ctypes。指针(ctypes.c_ubyte)