作者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
--
1F:→ GNUGCC:void main(void) 的写法是可行的唷^^08/10 00:59
2F:→ GNUGCC:虽然这个写法较传统,但是语法与文法都正确哦^^08/10 02:16
3F:→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 与 08/10 20:18
4F:→ GNUGCC:int main(void),各位可以把 C++ 专案改成原生 C++ 类型来 08/10 20:19
5F:→ GNUGCC:用 void main(void) 来写发现也可通过编译. 08/10 20:21
6F:→ GNUGCC:这个就是 Visual C++ 的弹性.08/11 20:23
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.94.57
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1432872560.A.821.html
※ 编辑: uranusjr (140.112.94.57), 05/29/2015 13:47:29