我一直在尝试使用制造商(ZKTECO)提供的SDK向设备设置一些数据。诸如连接,断开连接,修改IP地址之类的某些功能可以正常工作,但是当我尝试将数据更新到内部表时,出现以下错误:exception: access violation writing 0x000000000205A040
。根据我的研究,最常见的问题与设置正确的 argtypes 和 restypes 有关,我将其应用于我的理解。作为额外的信息,我将python 3.7与Windows 10 pro 64位一起使用。
文档中的功能
int SetDeviceData(HANDLE handle,const char *TableName, const char *Data, const char *Options)
int Connect(const char *Parameters)
Void Disconnect(HANDLE handle)
我到目前为止的代码:
import ctypes
from ctypes import cdll, windll, create_string_buffer, c_char_p, c_void_p
from ctypes.wintypes import HANDLE
zk = windll.LoadLibrary("C:/Windows/System32/plcommpro.dll")
zk.Connect.argtypes = [c_char_p]
zk.Connect.restype = HANDLE
zk.SetDeviceData.argtypes = (HANDLE, c_char_p, c_char_p, c_char_p)
zk.SetDeviceData.restypes = ctypes.c_int
zk.Disconnect.argtypes = [HANDLE]
zk.Disconnect.restypes = c_void_p
params = b"protocol=TCP,ipaddress=192.168.100.178,port=4370,timeout=2000,passwd="
params_buf = c_char_p(params)
handler = zk.Connect(params_buf)
string = "Handler is: {0}\n".format(handler)
print(string)
try:
table = b"user"
data = b"Pin=9999\tPassword=1793\tName=Test\tStartTime=20190522\tEndTime=2010523"
options = b""
table_buf = c_char_p(table)
data_buf = c_char_p(data)
ret = zk.SetDeviceData(handler, table_buf, data_buf, options)
del table_buf
del data_buf
result = "Result: {0}".format(ret)
print(result)
except Exception as e:
print(e)
zk.Disconnect(handler)
TraceBack:
Traceback (most recent call last):
File "tmpdll.py", line 35, in <module>
ret = zk.SetDeviceData(handler, table, data, options)
OSError: exception: access violation writing 0x000000005EF65040
答案 0 :(得分:0)
似乎在python 3.7上生成handle
的方式存在一些问题。
我测试了其他版本,并且似乎在3.5版之后发生了错误,下面的任何版本似乎都可以正常工作。