最近做了小小的測試,使用python的ctypes來實做windows api的data type
ex.1
用ctypes實做如下先將名為Char的union實做出來
噹噹噹~mission complete
ex.2
當然用python去CALL用C寫的dll也有其他目的,通常是效率問題,把效率吃緊的地方給較低階的語言去實做,目前知道有個叫SWIG,可以將很多語言黏在一起,因為小弟也沒用過所以不敢多言
ex.1
typedef struct _CHAR_INFO {
union{
WCHAR UnicodeChar;
CHAR AsciiChar;
} Char;
WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;用ctypes實做如下先將名為Char的union實做出來
class Char(ctypes.Union):
_fields_ = [("UnicodeChar",WCHAR),
("AsciiChar", CHAR)]
再來將CHAR_INFO整個structure實做出來class CHAR_INFO(ctypes.Structure):
_anonymous_ = ("Char",)
_fields_ = [("Char", Char),
("Attributes", WORD)]
PCHAR_INFO = ctypes.POINTER(CHAR_INFO)
噹噹噹~mission complete
ex.2
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
}CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
class CONSOLE_CURSOR_INFO(ctypes.Structure):
_fields_ = [('dwSize', DWORD),
('bVisible', BOOL)]
其實ctypes這模組挺方便的,可以隨意的call用C寫出來的dll檔,如果只是想要用到一點點dll檔,我想自己寫就好了,不需要去用到其它模組,像是如果你要大量的用到windows api那就果斷用pywin32吧:),裡面可幫你寫好一堆的東西呢,畢竟這動作實在是很機械式,有別人幫你種樹,就去乘涼吧。當然用python去CALL用C寫的dll也有其他目的,通常是效率問題,把效率吃緊的地方給較低階的語言去實做,目前知道有個叫SWIG,可以將很多語言黏在一起,因為小弟也沒用過所以不敢多言
python ctypes