我试图在Windows 7上使用python 2.7访问DLL中的函数,该函数请求指向包含void指针数组的结构的指针。目前,我没有这个DLL的源代码,但我确实有头文件,其中包含有问题的函数的函数原型以及结构的定义。
typedef struct {
unsigned long PagesPerMark[MAX_NUM_DMA_CHANNELS];
void *VirtDMAAdr[MAX_NUM_DMA_CHANNELS][MAX_DMA_PAGES_PER_CH];
unsigned long long PhysDMAAdr[MAX_NUM_DMA_CHANNELS][MAX_DMA_PAGES_PER_CH];
} s_DMAConfig;
typedef struct {
s_DMAConfig DMA;
void *User;
} s_Adapter;
#ifdef WIN32
#define EXPORTULONG __declspec(dllexport) unsigned long
#else
#define EXPORTULONG unsigned long
#endif
EXPORTULONG Adapter_Zero(s_Adapter *p_Adapter);
import ctypes
MAX_NUM_DMA_CHANNELS = 4
MAX_DMA_PAGES_PER_CH = 1024
class s_DMAConfig(ctypes.Structure):
_fields_ = [("PagesPerMark", ctypes.c_ulong * MAX_NUM_DMA_CHANNELS),
("VirtDMAAddr", ctypes.POINTER(ctypes.c_void_p * MAX_NUM_DMA_CHANNELS * MAX_DMA_PAGES_PER_CH)),
("PhysDMAAdr", ctypes.c_ulonglong * MAX_NUM_DMA_CHANNELS * MAX_DMA_PAGES_PER_CH)]
class s_Adapter(ctypes.Structure):
_fields_ = [("DMA", s_DMAConfig),
("User", ctypes.c_void_p)]
uLongArray = ctypes.c_ulong * MAX_NUM_DMA_CHANNELS
pagePerMark = uLongArray()
voidPtrArr = ctypes.c_void_p * MAX_NUM_DMA_CHANNELS * MAX_DMA_PAGES_PER_CH
virtDMAAddr = voidPtrArr()
uLongLongArray = ctypes.c_ulonglong * MAX_NUM_DMA_CHANNELS * MAX_DMA_PAGES_PER_CH
physDMAAddr = uLongLongArray()
dmaConfig = s_DMAConfig(pagePerMark, ctypes.pointer(voidPtrArr()), physDMAAddr)
userInput = ctypes.c_void_p()
adapter = s_Adapter(dmaConfig, userInput)
## Load DLL
RRadapter = ctypes.cdll.LoadLibrary("myLib.dll")
Adapter_Zero = RRadapter.Adapter_Zero
Adapter_Zero.restype = ctypes.c_ulong
Adapter_Zero.argtypes = [ctypes.POINTER(s_Adapter),]
Adapter_Zero(ctypes.byref(adapter))
当我尝试运行此解决方案时,它会在调用DLL函数后立即崩溃python解释器。没有返回错误,所以我不确定接下来我应采取什么行动。我对Python很陌生,所以任何建议都会非常感激。
我已经查看了其他类似的问题,例如Python ctypes pointer to pointer to structure以及Python & Ctypes: Passing a struct to a function as a pointer to get back data,但无济于事。另外,我找不到使用void ptr数组的任何好例子,所以我希望这个问题可以帮助其他可能处于类似情况的人。
1)我是否使用Python的ctypes正确实现了对DLL的调用?
2)如果我正确实现了Python脚本(我很可能没有),我可以使用哪些免费工具来调查失败的原因?
答案 0 :(得分:0)
你有任何崩溃报告吗?
你试过了吗?
RRadapter = ctypes.CDLL('lib.dll')
这适用于我的上一个项目。
抱歉没有评论的权利。