经过数小时的研究和主题分析,我找不到正确解决问题的解释和方法。如果您找到答案,非常感谢您提前。
我的问题摘要:
我正在使用 python 3.8(64 位版本)和一个 dll(64 位版本)。而且,由于指针问题(据我所知),尽管有 ctypes 功能(argstype、restype..etc),但我无法将其正确包装到我的 python 代码中。
令我困扰的是,相同的 32 位 DLL 和 python 32 位在我的 python 代码中运行良好。
请在此之后找到:
- C 原型
- 包装 C 函数的 Python 代码
- C函数在python代码中的用法
C 函数原型(来自 API 描述): WORD mpc_AddToScenarioPcd (BYTE, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, POINTER(BYTE), DWORD, POINTER(BYTE), VOID *)
我的 Python 代码来包装这个(64 位版本和 32 位版本注释):
from ctypes import *
# DLL Loading ---------------------------------------------------------------------------------------
# 64 Bits -------------------------------------------------------------------------------------------
dllpath = '%s/MP300Com64.dll' % str(os.path.dirname(__file__))
MP300Dll = WinDLL(dllpath)
MP300Dll_CDECL = CDLL(dllpath)
# 64 Bits -------------------------------------------------------------------------------------------
# dllpath = '%s/MP300Com.dll' % str(os.path.dirname(__file__))
# MP300Dll = WinDLL(dllpath)
# MP300Dll_CDECL = CDLL(dllpath)
# Keyword Type definition ---------------------------------------------------------------------------
WORD = c_ushort
DWORD = c_ulong
BYTE = c_ubyte
# Function Wrapped ----------------------------------------------------------------------------------
mpc_AddToScenarioPcd = MP300Dll_CDECL.MPC_AddToScenarioPcd
mpc_AddToScenarioPcd.argtypes = [BYTE, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD,
POINTER(BYTE), DWORD, POINTER(BYTE), POINTER(DWORD)]
mpc_AddToScenarioPcd.restype = WORD
# -- Creation of the First Pointer to the array of Bytes --------------------------------------------
array1 = (BYTE* len(5))(*[BYTE(1),BYTE(2),BYTE(3),BYTE(4),BYTE(5)])
array2 = (BYTE* len(5))(*[BYTE(10),BYTE(20),BYTE(30),BYTE(40),BYTE(50)])
# -- Pointer cast of the array1 and 2 ---------------------------------------------------------------
cast(array1, POINTER(BYTE))
cast(array2, POINTER(BYTE))
# VOID* obj creation --------------------------------------------------------------------------------
param = c_void_p()
# -- Function Usage through Python Code -------------------------------------------------------------
mpc_AddToScenarioPcd(BYTE(0),
DWORD(0),
(22),
DWORD(1),
DWORD(1),
DWORD(1),
DWORD(1),
DWORD(2),
array1,
DWORD(10),
array2,
param)
使用 Python 3.4(32 位版本)和 DLL 32 位:
=> 一切正常,没有错误。
使用 Python 3.8(64 位版本)和 DLL 64 位:
=>我得到这个异常:OSError:异常:访问冲突读取0x000000005EC0B808
我需要使用 64 位版本,因此我被这个问题阻止了......如果有人可以向我解释我的 64 位指针(或类型使用......)有什么问题,以及如何解决,我将不胜感激!!
再次非常感谢您在我的主题上的所有专业知识和工作,
PS:抱歉代码没有功能,无法重现异常