作者uranusjr (←這人是超級笨蛋)
看板Python
標題Re: [問題] python ctypes調用dll問題
時間Fri May 29 12:09:17 2015
c_char_p 代表一個 char *, 而 byref 代表取 reference
所以(下面假設 function 是一個 C 函式)
pKey = c_char_p(0x010203040506)
function(byref(pKey))
大致上可以轉換成下面的 C 程式碼
char *pKey = 0x010203040506;
function(&pKey);
這應該不是你要的
你想做的應該是傳入 "\1\2\3\4\5\6" <-- 這是 C
ctypes 可以自動把 Python bytes 轉換成 C 的 char *
所以直接這樣寫應該就行了
# 設定引數型態, 讓 ctypes 知道怎麼轉換
dll.rf_M1_authentication2.argtypes = [c_ushort, c_ubyte, c_ubyte, c_char_p]
rf_M1_authentication2(icdev, key_model, block_b60, b'\1\2\3\4\5\6')
寫 ctypes 的時候要用 C 的方法來思考
它的所有的變數宣告基本上都可以直接對應到一個 C statement
所以其實可以先想好 C 怎麼寫, 再轉換成 Python + ctypes
這樣有時候會方便一些
※ 引述《waynezen (Wayne)》之銘言:
: 感謝!已經可以了,再請教個問題要傳入一組6Bytes命令,我使用c_char_p,但回應給我似乎只有4bytes沒有成功?
: ------------------------------------
: from ctypes import windll,byref,pointer,c_int,c_ushort,c_char,c_char_p
: import time
: dll = windll.LoadLibrary("MasterRD.dll")
: port = 1
: baud = 19200
: reader_model = 0x41
: icdev = 0
: msec = 10
: color = 2
: type = 0x41
: REQ_model = 0x52
: bcnt = 4
: key_model = 0x60
: block_b60 = 0x60
: block_b61 = 0x61
: block_b62 = 0x62
: block_b63 = 0x63
: pKey =c_char_p(0x010203040506)
: rf_M1_authentication2 = dll.rf_M1_authentication2(icdev,key_model,block_b60,byref(pKey))
: print rf_M1_authentication2
: X
--
→ GNUGCC:void main(void) 的寫法是可行的唷^^08/10 00:59
→ GNUGCC:雖然這個寫法較傳統,但是語法與文法都正確哦^^08/10 02:16
→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 與 08/10 20:18
→ GNUGCC:int main(void),各位可以把 C++ 專案改成原生 C++ 類型來 08/10 20:19
→ GNUGCC:用 void main(void) 來寫發現也可通過編譯. 08/10 20:21
→ GNUGCC:這個就是 Visual C++ 的彈性.08/11 20:23
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.94.57
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1432872560.A.821.html
※ 編輯: uranusjr (140.112.94.57), 05/29/2015 13:47:29