最近做了小小的測試,使用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