使用ZKteco SDK编写Python访问冲突

时间:2019-05-22 21:39:59

标签: python ctypes

我一直在尝试使用制造商(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

1 个答案:

答案 0 :(得分:0)

似乎在python 3.7上生成handle的方式存在一些问题。

我测试了其他版本,并且似乎在3.5版之后发生了错误,下面的任何版本似乎都可以正常工作。