Python ctypes在参数调用DLL函数时出现问题

2024-09-24 08:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾多次尝试使用结构作为参数调用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


Tags: fromimportinputexitctypeslaunchintbool