找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 10153|回复: 13

[已解决] rmb 10 元 Ctypes OSError: exception: access violation writing 0x00000000

1

主题

8

帖子

8

积分

贫民

积分
8
layty 发表于 2017-11-8 09:23:17 | 显示全部楼层 |阅读模式
本帖最后由 layty 于 2017-11-9 12:24 编辑


环境:x86,win7 python3.6
模块:ctypes
问题:
    有这么一个dll的函数Error_Read (MError , Meter_No ,Dev_Port)
    参数MError 是一个数组缓冲,返回函数的处理结果
    c里面直接定义个全局数组,然后传递该数组地址即可。
    我在python中是这么调用的
    p =create_string_buffer(50)
    dll.Error_Read(p,1,1)
报错:
    OSError: exception: access violation writing 0x00000000

    如果我初始化
    p =create_string_buffer(b'01'*50)
报错:
    OSError: exception: access violation writing 0x01010101
现象:
   传递参数的时候python是将p的值作为参数直接传递进去了,我现在不知道如何取地址值
  1. p =create_string_buffer(50)
  2. p
  3. <ctypes.c_char_Array_50 object at 0x02E8D3A0>
  4. p.value
  5. b''
复制代码
  1. p =create_string_buffer(b'01'*50)
  2. p
  3. <ctypes.c_char_Array_101 object at 0x02E8D3F0>
  4. p.value
  5. b'0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101'
复制代码

测试代码
  1. #环境导入
  2. import ctypes
  3. dll = ctypes.windll.LoadLibrary( 'hscom.dll' )
  4. from ctypes import *
复制代码
  1. dll.Error_Read(p,1,1)
复制代码



回复

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-9 09:37:20 | 显示全部楼层
layty 发表于 2017-11-9 09:14
如图,貌似没有起作用,还是取值了

char *cstrData = new char[20];
memset(cstrData, 0, 20);
bGet = myerrorread(&cstrData,1,1);
c 语言这三句话在 python 中是这样对应的
p = pointer((c_char * 20)())
memset(p, 0, 20)
dll.Error_Read(byref(p), 1, 1)

点评

good  发表于 2017-11-9 10:19
回复 支持 1 反对 0

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-8 10:08:51 | 显示全部楼层
create_string_buffer 的结果输出什么?
试试p = ['0'] * 50
回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
layty  楼主| 发表于 2017-11-8 21:21:43 | 显示全部楼层
剑心无痕 发表于 2017-11-8 10:08
create_string_buffer 的结果输出什么?
试试p = ['0'] * 50
  1. import ctypes
  2. dll = ctypes.windll.LoadLibrary( 'hscom.dll' )
  3. from ctypes import *
  4. p = ['0'] * 50
  5. dll.Error_Read(p,1,1)
  6. Traceback (most recent call last):
  7.   File "<input>", line 1, in <module>
  8. ctypes.ArgumentError: argument 1: <class 'TypeError'>: Don't know how to convert parameter 1
复制代码
回复 支持 反对

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2017-11-9 07:52:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
layty  楼主| 发表于 2017-11-9 09:14:00 | 显示全部楼层
  1. p =create_string_buffer(b'0000'*50)
  2. dll.Error_Read(addressof(p),1,1)
  3. Traceback (most recent call last):
  4.   File "<input>", line 1, in <module>
  5. OSError: exception: access violation writing 0x30303030
复制代码


如图,貌似没有起作用,还是取值了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
layty  楼主| 发表于 2017-11-9 09:46:24 | 显示全部楼层
剑心无痕 发表于 2017-11-9 09:37
char *cstrData = new char[20];
memset(cstrData, 0, 20);
bGet = myerrorread(&cstrData,1,1);

我尝试了一下,可以调用,p的值怎么显示,我尝试了 p.value 无法成功
回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
layty  楼主| 发表于 2017-11-9 10:00:40 | 显示全部楼层
剑心无痕 发表于 2017-11-9 09:37
char *cstrData = new char[20];
memset(cstrData, 0, 20);
bGet = myerrorread(&cstrData,1,1);

我试了下用 p[0].value 可以成功打印



最后再问一下,新人比较迷茫,这个东西你是在官方的doc上找到的么?
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-9 10:00:57 | 显示全部楼层
本帖最后由 剑心无痕 于 2017-11-9 10:02 编辑
layty 发表于 2017-11-9 09:46
我尝试了一下,可以调用,p的值怎么显示,我尝试了 p.value 无法成功

p.contents 里面的数据类型是c_char_Array_20 相当于c语言的char[20]
p.contents.value应该是你想要的值吧


回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-9 10:05:46 | 显示全部楼层
layty 发表于 2017-11-9 10:00
我试了下用 p[0].value 可以成功打印

不是,试出来的,dir(ctypes)里面的类型尝试一下就出来了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表