欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
python ctypes庫中動(dòng)態(tài)鏈接庫加載方式

最近看了《Gray hat python》一書(shū),這才知道為什么python是黑客必學(xué)的編程語(yǔ)言。通過(guò)python的ctypes模塊,可以直接調用動(dòng)態(tài)鏈接庫中的導出函數,而且甚至可以直接在python中構建出復雜的C結構體?。?!使得python也具備了底層內存操作的能力,再配合python本身強大的表達能力,能不讓人激動(dòng)么。

 

之前為了在python中調用動(dòng)態(tài)鏈接庫導出的函數,你需要自行解析出這些導出函數的地址。而現在ctypes庫會(huì )替我們完成這個(gè)麻煩的過(guò)程,大大方便了我們直接在python中調用C函數的能力。

ctypes模塊中有三種不同的動(dòng)態(tài)鏈接庫加載方式:cdll, windll, oledll。不同之處在于鏈接庫中的函數所遵從的函數調用方式(calling convention)以及返回方式有所不同。

cdll用于加載遵循cdecl標準函數調用約定的鏈接庫。windll則用于加載遵循stdcall調用約定的動(dòng)態(tài)鏈接庫。oledll與windll完全相同,只是會(huì )默認其載入的函數會(huì )統一返回一個(gè)Windows HRESULT錯誤編碼。

先復習一下有關(guān)函數調用約定的知識:函數調用約定指的是函數參數入棧的順序、哪些參數入棧、哪些通過(guò)寄存器傳值、函數返回時(shí)棧幀的回收方式(是由調用者負責清理,還是被調用者清理)、函數名稱(chēng)的修飾方法等等?;旧衔覀冏畛R?jiàn)的調用約定就是cdecl和stdcall兩種。在《程序員的自我修養--鏈接、裝載與庫》一書(shū)的第10章有對函數調用約定的更詳細介紹。

cdecl規定函數參數列表以從右到左的方式入棧,且由函數的調用者負責清除棧幀上的參數。stdcall的參數入棧方式與cdecl一致,但函數返回時(shí)是由被調用者自己負責清理棧幀。而且stdcall是Win32 API函數所使用的調用約定。OK,就這么多,夠了。

測試一下在Linux平臺和Windows平臺下通過(guò)ctypes模塊導入C庫中函數的小例子:

Windows 下:

from ctypes import *
msvcrt = cdll.msvcrt
msg = "Hello world!\n"
msvcrt.printf("Testing: %s", msg)


Linux下:

from ctypes import *
libc = CDLL("libc.so.6")
msg = "Hello, world!\n"
libc.printf("Testing: %s", msg)

 

可以看到動(dòng)態(tài)鏈接庫中的printf被直接導入到python中來(lái)調用了。

那么,在python中怎么表示C的類(lèi)型?不用擔心,下面這張表就能搞定。

有了這個(gè)映射關(guān)系,多復雜的C類(lèi)型也能在python中表達出來(lái)。

 

在C中定義一個(gè)聯(lián)合:

union 
{
long barley_long;
int barley_int;
char barley_char[8];
}barley_amount;

 

而在python中同等的定義為:注意一下python中定義數組的方式。

class barley_amount(Union):
_fields_ = [
("barley_long", c_long),
("barley_int", c_int),
("barley_char", c_char * 8),
]



測試一下這個(gè)例子,在python中定義一個(gè)聯(lián)合體,為其賦值,再分別訪(fǎng)問(wèn)其成員。

from ctypes import *
class barley_amount(Union):
_fields_ = [
("barley_long", c_long),
("barley_int", c_int),
("barley_char", c_char * 8),
]
value = raw_input("Enter the amount of barley to put into the beer vat:")
my_barley = barley_amount(int(value))
print "Barley amount as a long: %ld" % my_barley.barley_long
print "Barley amount as an int: %d" % my_barley.barley_int
print "Barley amount as a char: %s" % my_barley.barley_char



 




 


  

 

 

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Python調用windows下DLL詳解 - ctypes庫的使用
Python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數
Python調用windows下DLL詳解
用Python來(lái)使用科大訊飛語(yǔ)音識別,so easy
Python與C之間的相互調用(PythonCAPI及Pythonctypes庫)
新中新a16d二代居民身份證閱讀器Python示例
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久