微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有带参数的回调函数的 Python ctypes - 抛出错误“分段错误核心转储”

如何解决带有带参数的回调函数的 Python ctypes - 抛出错误“分段错误核心转储”

我正在制作一个 python 应用程序,它使用 ctypes 库与第三方提供的 c++ 共享库进行通信。

我得到了一个演示 C++ 程序来演示共享库的用法,所以我基本上是将 C++ 代码重写为 python/ctypes。

有些功能运行良好,但现在我不断收到错误

分段错误(核心转储)

在下面的代码上(特别是在应该回调python函数的那一行):

from ctypes import *
LIB_PATH = 'libxxyy.so'

DEFINE1 = 8
DEFINE1_A = (DEFINE1 + 1 + 3) & 0xfffffffc
DEFINE2 = 255
DEFINE2_A = (DEFINE2 + 1 + 3) & 0xfffffffc

class VAR_ENTRY(Structure):
    _fields_ = [
        ('Name',c_char * (DEFINE1_A + DEFINE2_A)),('Format',c_uint16),('Len',c_uint16)
    ]

ListvariablesCallBack = CFUNCTYPE(c_uint8,POINTER(VAR_ENTRY),c_void_p)    #see Update 1 below
@CFUNCTYPE(c_uint8,c_void_p)
def ListvariablesCallBack_func(pvEntry,userParam):
    print("hello from callback")
    # Then read data from pvEntry,add 1 to userParam
    return 0

def MODULE_Listvariables(moduleHandle: c_void_p,cb,userParam: c_void_p) -> c_int32:
    '''
    cb – Callback function to be called for every variable.
    userParam – Parameter,that is passed to callback function.
    '''
    x1lib.MODULE_Listvariables.argtypes = (c_void_p,ListvariablesCallBack,c_void_p)  # See Update 1 below
    x1lib.MODULE_Listvariables.ABCtype = c_int32
    return x1lib.MODULE_Listvariables(moduleHandle,userParam)      # ERROR OCCURS HERE

def browseVariables(targetHandle: c_void_p,moduleName: c_char_p) -> c_int32:
    modHandle = # calculated
    countModules = c_uint32(0)
    ret = MODULE_Listvariables(modHandle,ListvariablesCallBack_func,byref(countModules))
    return

def main():
    targetHandle = # calculated
    browseVariables(targetHandle,c_char_p(b"ABC"))

if __name__ == "__main__":
    x1lib = CDLL(LIB_PATH)
    main()

我正在翻译的 cpp 演示如下所示:

/*
 * <demo.h>
 */
#define CALLBACK

typedef struct
{   
    CHAR8   Name[DEFINE1_A + DEFINE2_A];
    UINT16  Format;
    UINT16  Len;
} VAR_ENTRY;

typedef BOOL8 (CALLBACK *ListvariablesCallBack) (const VAR_ENTRY * varEntry,const VOID* userParam);

X1LIB SINT32 MODULE_Listvariables(M1C_H_MODULE moduleHandle,const ListvariablesCallBack cb,const VOID * userParam); 

/*
 * <demo.cpp>
 */
static BOOL8 CALLBACK listvariablesCallback(const VAR_ENTRY *pvEntry,const VOID *userParam)
{
    UINT32 *countElements = (UINT32 *)userParam;
    (*countElements)++;
    printf("%s\n",pvEntry->Name);
    return true;
}

SINT32 browseVariables(M1C_H_TARGET targetHandle,CHAR8* moduleName)
{
    /* modHandle calculated*/
    UINT32 countModules=0;
    ret = MODULE_Listvariables(modHandle,listvariablesCallback,&countModules);
    return;
}

int main(int argc,char* argv[])
{
    browseVariables(targetHandle,(CHAR8 *)"ABC");
}

我做错了什么? (见更新 1)

使用的来源(到目前为止): https://docs.python.org/3.3/library/ctypes.html?highlight=ctypes#callback-functions https://stackoverflow.com/a/33485103

更新 1:

因此,我设法使脚本运行,方法是在 ListvariablesCallBack = CFUNCTYPE(c_uint8,c_void_p) 正上方添加@CFUNCTYPE(c_uint8,c_void_p) 并将 MODULE_Listvariables 函数中的 argTypes 设置为:x1lib.MODULE_Listvariables.argtypes = (c_void_p,c_void_p)(我已经在上面的脚本中添加了更改)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?