ctypes:O错误:异常:读取0x00000001时发生访问冲突



我尝试通过带有python的c dll与HV电源进行通信。我开始工作的最简单的功能。但是,如果我调用更复杂的函数CAENHVInitSystem,我会得到一个错误:OSError:exception:读取0x00000001的访问冲突。我对Python中的ctypes很陌生。据我所知,这个错误可能是因为我的一些参数类型错误。但是,我如何才能对它进行更多的调试,以确切地知道哪个参数是错误的?有人看到我的错误了吗?

提前感谢

import os
from ctypes import *
bib = CDLL("CAENHVWrapper")
ret = bib.CAENHVLibSwRel()  # This call works
print(c_char_p(ret)) 
sysType = c_int(1) #SY2527
link = c_int(0) #TCP/IP
#arg = c_char_p(b'149.217.10.241')  #i change it for test to c_void_p but later the arg should be the ip adress
arg = c_void_p()                   
user = c_char_p(b'admin')
passwd = c_char_p(b'admin')
sysHndl = c_int()
# c function definition in the header file
#CAENHVLIB_API CAENHVRESULT CAENHV_InitSystem(
#   CAENHV_SYSTEM_TYPE_t system,
#   int LinkType,
#   void *Arg,
#   const char *UserName,
#   const char *Passwd,
#   int *handle);
# definition of the enum of the first argument
#typedef enum {
#   SY1527      = 0,
#   SY2527      = 1
#} CAENHV_SYSTEM_TYPE_t;
bib.CAENHVInitSystem.argtypes = [c_int, c_int, c_void_p, c_char_p, c_char_p,     POINTER(c_int)]
ret = bib.CAENHVInitSystem(sysType, link, arg, user, passwd, byref(sysHndl))
print(ret)
print(bib.CAENHV_GetError(sysHndl))

CAENHVInitSystem的第一个参数是类型为const char*的系统名称。您错误地传递了一个值为1的整数。当CAENHVInitSystem将其解释为指针时,它尝试读取地址1处的存储器。因此出现了错误。将第一个参数类型更改为c_char_p,然后传递文本。

据我所知,这个函数有5个参数,而不是6个,所以我相信你有更多的错误,而不仅仅是上面提到的那个。

将来,当询问有关二进制互操作的问题时,必须提供接口两侧的详细信息。我通过在网上搜索CAENHVInitSystem来回答这个问题,并希望我找到的声明与您正在使用的声明匹配。但也许事实并非如此。您可能拥有CAENHVInitSystem的真实声明,并且该信息至关重要。这应该是个问题。

在Ctypes设置中,当程序的多个实例意外并行运行时,我出现了这个错误。

从本质上讲,我忘记了关闭旧的程序实例,它们一直保留着DLL文件,因此当最新版本试图访问它时,却无法访问。

最新更新