免费注册 查看新帖 |

Chinaunix

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

Python调用Dll--继续请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-12 15:36 |只看该作者 |倒序浏览
本帖最后由 wenerban 于 2011-11-05 18:12 编辑

我有一个DLL,现在VBA可以调用:
比如
Private Declare Function OpenFile Lib "test.dll" _
        Alias "_OpenFile@3" (ByRef filename As String, ByRef openMode As String) As Long

OpenFile("1.txt","r")
就可以实现调用接口,运行正常。
Python代码如下:
       dll = ctypes.windll.LoadLibrary("test.dll")
        OpenFile = getattr(dll, "_OpenFile@3")
        OpenFile("1.txt","r")
这个就会出现WindowsError: exception: access violation reading 0x00000072的错误,求高手指教。谢谢

接着请教,呵呵!!
目前可以调用直接传值的函数,但是传递引用的函数还是有问题。
如上OpenFile的函数,里面的文件名和读取模式都是以引用的方式进行传递
所以必须要定义传递的类型,我是这样写的:
OpenFile.argtypes = [ctypes.POINTER(ctypes.c_char_p), ctypes.POINTER(ctypes.c_char)]
然后再进行传递:
strFile = ctypes.c_char_p("1.txt")
搞定参数传递了,其实很简单,两个参数都用ctypes.c_char_p即可,但是现在又出现了一个问题,竟然说:
ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong calling convention
但是VB调用两个参数就够了,真他妈的麻烦!

readMode = ctypes.c_char("r")
OpenFile(ctypes.byref(strFile), ctypes.byref(readMode))
到调用的时候同样是这个错误,也试过OpenFile(ctypes.addressof(strFile), ctypes.addressof(readMode))来调用,
都是有问题的希望高手可以帮忙解答一下。谢谢
以上问题全部解决,两个参数都用c_char_p即可。但是现在又有问题:
ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong calling convention
VB2个参数可以调用,为什么Python就不行,我擦,绝望了!

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
2 [报告]
发表于 2011-10-13 09:08 |只看该作者
用ctypes.cdll 看看

论坛徽章:
0
3 [报告]
发表于 2011-11-05 17:38 |只看该作者
使用的是CDLL调用的dll文件

论坛徽章:
0
4 [报告]
发表于 2011-11-05 22:00 |只看该作者
回复 1# wenerban
动态库传上来吧

论坛徽章:
0
5 [报告]
发表于 2011-11-06 21:00 |只看该作者
谢谢关注,已经找到了相关的Python模块代替Dll文件了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP