免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8597 | 回复: 18
打印 上一主题 下一主题

python调用DLL问题(急) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-05 17:14 |只看该作者 |倒序浏览
test.DLL中封装了几个函数
int A()
int B(int Handle, ref long Len_s1, ref long Len_s2)

其中,Handle是调用A后得到的句柄,需要传入到B中

python实现:

import cytpes

#加载DLL

tt=ctypes.CDLL('C:\\Python26\\test.dll')

s1=A();
ss=ctypes.c_int()
ssd=ctypes.c_int()
s2=B(s1,ctypes.byref(ss),ctypes.byref(ssd))

从s2的返回值来看,调用是成功的,但是ss,和ssd的值始终为零,请各位大虾帮帮忙看看是什么问题

[ 本帖最后由 Heaice 于 2009-1-5 17:21 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-01-05 18:13 |只看该作者
ref long Len_s1, ref long Len_s2这是什么意思?

论坛徽章:
0
3 [报告]
发表于 2009-01-05 23:07 |只看该作者
原帖由 luffy.deng 于 2009-1-5 18:13 发表
ref long Len_s1, ref long Len_s2这是什么意思?



这个好像是C++中得吧~
应该是指出该参数是一个对象得引用
ref long Len_s1, ref long Len_s2就是说,Len_s1,Len_s2是一个long型的引用,可以这么理解~

其实,这两个参数的值是由该函数处理后,需要在外面其他地方使用的

论坛徽章:
0
4 [报告]
发表于 2009-01-06 08:35 |只看该作者
ss    ssd 你也没赋值啊。你赋个值试试 比如。
ss=ctypes.c_int()
ss=15

[ 本帖最后由 luffy.deng 于 2009-1-6 08:40 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-01-06 09:20 |只看该作者
原帖由 luffy.deng 于 2009-1-6 08:35 发表
ss    ssd 你也没赋值啊。你赋个值试试 比如。
ss=ctypes.c_int()
ss=15



ss和ssd的赋值也只能是 ss=ctypes.c_int(10),ssd=ctypes.c_int(20)这样赋值,否则,ss和ssd就不是ctypes类型了

即使对ss和ssd进行赋值后,执行B函数后,ss和ssd的值还是零。



是不是对C++的DLL库,ctypes不支持活着不能使用,而ctypes只能用于C的DLL库,昨天在查找的时候,看到有人这么说,但不确定是否正确

[ 本帖最后由 Heaice 于 2009-1-6 09:27 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-01-06 09:42 |只看该作者
ss.value=15这样也是可行的。能不能给一个test.dll?

论坛徽章:
0
7 [报告]
发表于 2009-01-06 10:41 |只看该作者
原帖由 luffy.deng 于 2009-1-6 09:42 发表
ss.value=15这样也是可行的。能不能给一个test.dll?



真实的dll,因某些原因可能无法提供了~

不过,我可以说明我使用该DLL的部分功能,你可以尝试自己创建一个试试

该DLL调用底层驱动程序,获得磁盘在一定时间内的读写文件的字节数,并在B函数中返回


而上述的ss以及ssd就是返回的字节数

[ 本帖最后由 Heaice 于 2009-1-6 10:44 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-01-06 11:14 |只看该作者
c++不会

论坛徽章:
0
9 [报告]
发表于 2009-01-06 11:20 |只看该作者
test.DLL中封装了几个函数
int A()
int B(int Handle, ref long Len_s1, ref long Len_s2)

python中调用
from ctypes import *

test = CDLL("test")

A = test.A
A.restype = c_int

B = test.B
B.restype = c_int
B.argtypes = [c_int, c_void_p, c_void_p]

#然后通过引用来调用
va1 = 0
va2 = 0
s2 = B( A(), byref(va1), bref(va2) )

论坛徽章:
0
10 [报告]
发表于 2009-01-06 11:37 |只看该作者
原帖由 newrain 于 2009-1-6 11:20 发表
va1 = 0
va2 = 0

...



其中
va1,va2得赋值应该是va1=ctypes.c_int(),va2=ctypes.c_int()

但是执行完B函数后,va1和va2得值还是零

[ 本帖最后由 Heaice 于 2009-1-6 12:19 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP