我曾多次尝试使用结构作为参数调用DLL函数,但都没有成功。我使用的是python2.7.8。这是我的代码:
from ctypes import c_int, c_bool, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT, sizeof
INPUT_PARM, OUTPUT_PARAM, INPUT_PARM_DEFAULT_ZERO = 1, 2, 4
prototype = WINFUNCTYPE(c_int, c_int, LPCSTR, LPCSTR, c_bool)
paramflags = ((INPUT_PARM, "Size", 0),
(INPUT_PARM, "ProgrammerExe", r"C:\Program Files (x86)\ChipProgUSB\6_00_05\UprogNT2.exe"),
(INPUT_PARM, "CommandLine", "/m"),
(INPUT_PARM, "DebugMode", True))
Programmer = prototype(("ACI_Launch", windll.ACI), paramflags)
Programmer()
这是我正在进行的DLL调用的文档:
^{pr2}$错误为异常:读取0x00000000的访问冲突 这看起来像是在尝试使用大小作为指针,当我删除Size参数时,it部分如下所示:
prototype = WINFUNCTYPE(c_int, LPCSTR, LPCSTR, c_bool)
paramflags = ((INPUT_PARM, "ProgrammerExe", ...
然后它给出:过程可能调用了太多参数(超出8字节)
DLL可从phyton.com网站作为演示。如果你在硬件页面的底部看到一个不需要注册的链接。在
更新:在eryksun的帮助下,我修正了我的大错。但我仍然有一个问题,我现在不知道如何解决:
from ctypes import c_int, c_bool, WINFUNCTYPE, windll, Structure,POINTER, c_void_p
from ctypes.wintypes import HWND, LPCSTR, UINT, sizeof, HRESULT
class ACI_Launch_Params(Structure):
_fields_ = [("Size" , c_int),
("ProgrammerExe" , LPCSTR ),
("CommandLine" , LPCSTR ),
("DebugMode" , c_bool ),
]
x=ACI_Launch_Params(64,r"C:\Program Files (x86)\ChipProgUSB\6_00_05\UprogNT2.exe","/m",False)
Launch = windll.ACI.ACI_Launch
Launch.argtypes = [POINTER(ACI_Launch_Params)]
Launch.restype = HRESULT
Exit = windll.ACI.ACI_Exit
Exit.argtypes = []
Exit.restype = HRESULT
print "start result",Launch(x)
time.sleep(4)
# prints Added for Debugging
print sizeof(x),x #OK
print x.Size #OK
print x._objects #OK
print x.__sizeof__() #Crash
print dir(x) #Crash
print x.__dict__ #Crash
del x #Crash
print "stop result",Exit()
time.sleep(3)
这将始终按预期启动应用程序,并且打印的返回值为0。但在python代码退出时,它崩溃了python.exe. 它似乎与结构“x”被删除的时间有关,如果我早些时候删除它,那么它就会在那时崩溃。我猜DLL正在释放这个结构,但是如果是这样的话,我怎么才能让它可靠地工作呢?在
事件记录器报告:
Faulting application name: python.exe, version: 0.0.0.0, time stamp: 0x53b1ecd8
Faulting module name: python27.dll, version: 2.7.8150.1013, time stamp: 0x53b1ecd6
Exception code: 0xc0000005
Fault offset: 0x00031fe5
Faulting process id: 0x62d8
目前没有回答
相关问题 更多 >
编程相关推荐