Python Ctypes将指针传递给包含void指针数组的结构

时间:2015-06-23 15:55:26

标签: python arrays pointers struct ctypes

说明:

我试图在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);

我尝试使用Python访问该函数:

    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脚本(我很可能没有),我可以使用哪些免费工具来调查失败的原因?

1 个答案:

答案 0 :(得分:0)

你有任何崩溃报告吗?

你试过了吗?

RRadapter = ctypes.CDLL('lib.dll')

这适用于我的上一个项目。

抱歉没有评论的权利。