ctypes:OSError:异常:访问冲突读取0x00000001
Posted
技术标签:
【中文标题】ctypes:OSError:异常:访问冲突读取0x00000001【英文标题】:ctypes: OSError: exception: access violation reading 0x00000001 【发布时间】:2014-11-01 19:49:59 【问题描述】:我尝试通过带有 python 的 c dll 与 HV-Supply 进行通信。我开始工作的最简单的功能。但是,如果我调用更复杂的函数 CAENHVInitSystem,我会得到一个错误:OSError:异常:访问冲突读取 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))
【问题讨论】:
【参考方案1】:CAENHVInitSystem
的第一个参数是const char*
类型的系统名称。您错误地传递了一个值为 1 的整数。当CAENHVInitSystem
将其解释为指针时,它会尝试读取地址 1 处的内存。因此出现错误。将第一个参数类型更改为c_char_p
,并传递文本。
据我所知,该函数有 5 个参数,而不是 6 个,所以我相信您的错误不仅仅是上面提到的错误。
以后,在询问有关二进制互操作的问题时,您必须提供接口双方的详细信息。我已经通过对CAENHVInitSystem
进行网络搜索来回答这个问题,并希望我找到的声明与您正在使用的声明相匹配。但也许事实并非如此。您大概拥有CAENHVInitSystem
的真实声明,并且该信息至关重要。它应该在问题中。
【讨论】:
以上是关于ctypes:OSError:异常:访问冲突读取0x00000001的主要内容,如果未能解决你的问题,请参考以下文章
ctypes,python3.8:OSError:异常:访问冲突写入0x00000000
ctypes,python3.5,OSError:异常:访问冲突写入 0x00000000
PYTHON - Ctypes:OSError:异常:访问冲突写入0xFFFFFFFFFA1C001B
OSError:异常:使用 Cyphon 基本示例读取访问冲突
WindowsError:异常:使用从 C++ 到 Python 的 ctypes 创建 DLL 时出现访问冲突或 Windows 错误 193