我正在嘗試使用Python ctypes訪問DLL文件中的函數。提供的功能描述如下。使用Python Ctypes將結構指針傳遞給DLL函數
Prototype: Picam_ConnectDemoCamera(PicamModel model,
const pichar* serial_number,
PicamCameraID* id)
Description: Virtually connects the software-simulated 'model' with 'serial_number'
and returns the camera id in `_id_`
Notes: `_id_` is optional and can be null
該函數引用了DLL中定義的幾個變量類型。這些變量描述未來
PicamModel
Type: enum
Description: The camera model.
PicamCameraID
Type: Struct
- PicamModel model: _model_ is the camera model
- PicamComputerInterface computer_interface: computer_interface is the method of
communication
- pichar sensor_name [PicamStringSize_SensorName]: sensor_name contains the name of
the sensor in the camera
- pichar serial_number [PicamStringSize_SerialNumber]: serial_number contains the
unique serial number of the camera
注that'pichar」中提供的頭文件中的一個定義如下:
typedef char pichar; /* character native to platform
這看起來簡單,但不工作對我來說有些原因。
我的理解如下:我通過功能三個變量:
1)model
,這實在是一個enum
。我被告知python ctypes本質上不支持枚舉,所以我傳遞一個整數2,它映射到一個特定的模型類型。
2)的指針,一個序列號(I可以使這件事:任意字符串)
3)的指針,PicamCameraID
,該DLL內定義的變量的類型,基於所述struct
類型
通過閱讀後我發現了一些很好的起點,但仍然運氣不佳。這是我最好的拍攝到目前爲止
def pointer(x):
PointerToType = ctypes.POINTER(type(x))
ptr = ctypes.cast(ctypes.addressof(x), PointerToType)
return ptr
class PicamCameraID(ctypes.Structure):
pass
PicamCameraID._fields_=[("model",ctypes.c_int),
("computer_interface",ctypes.c_int),
("sensor_name",ctypes.c_char_p),
("serial_number",ctypes.c_char_p)]
myid = PicamCameraID()
model = ctypes.c_int(2)
serialnum = ctypes.c_char_p('asdf')
print picam.Picam_ConnectDemoCamera(model, pointer(serialnum), ctypes.byref(myid))
正如你可以看到希望,我試圖創建一個對應於DLL中定義的PicamCameraID
結構變量類型。我的直覺是在將參數傳遞給函數時使用ctypes.pointer
命令來引用此參數,但我發現使用ctypes.byref
而不是elsewhere。
代碼運行而不會出現錯誤(返回0),不過,我得到不同的結果,當我嘗試訪問結構PicamCameraID
的屬性:
myid.model
返回「2」,這是偉大的,是我指定什麼 myid.computer_interface
返回 「1」,這是細
BUT問題是myid.serial_number
返回
Traceback (most recent call last): File "<pyshell#28>", line 1, in
<module>
myid.serial_number ValueError: invalid string pointer 0x2820303031207820
個
和myid.sensor_name
回報:
Traceback (most recent call last): File "<pyshell#29>", line 1, in
<module>
myid.sensor_name ValueError: invalid string pointer 0x3034333120563245
出於某種原因,這些字符串沒有被正確填充?
任何想法,將不勝感激,我是新手到Python ctypes的(和c)
親切的問候
加入2013年6月1日
typedef enum PicamStringSize {
PicamStringSize_SensorName = 64,
PicamStringSize_SerialNumber = 64,
PicamStringSize_FirmwareName = 64,
PicamStringSize_FirmwareDetail = 256 } PicamStringSize;
typedef struct PicamCameraID {
PicamModel model;
PicamComputerInterface computer_interface;
pichar sensor_name[PicamStringSize_SensorName];
pichar serial_number[PicamStringSize_SerialNumber];
} PicamCameraID;
什麼是'pichar'?字符串的大小是如何確定的?如果您不通過'pointer()'調用直接傳遞'serialnum',會發生什麼? – jfs
J.F. - 感謝您的回覆。我的頭文件告訴我以下內容: typedef char pichar;/*字符原生平臺 換句話說,我相信它只是重新映射char? – Joe