- 论坛徽章:
- 0
|
本帖最后由 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就不行,我擦,绝望了! |
|