5

为了把它放到上下文中,我正在为 C DLL 创建一个包装器 - 相当复杂的用例,但请坚持我!

在我的包装类初始化期间,我为我的 C DLL 函数创建别名,以便我的类以后可以轻松访问它们。我要做的另一项任务是将一个回调传递给我的类中的一个函数到我的 DLL,它保存在一个静态变量中供以后使用。

最后,我生成了另一个线程,该线程在我的 DLL 中重复调用一个函数,该函数在其执行过程中的各个点执行一些工作,需要使用在我的类的 init 阶段分配的回调回调到 Python 程序。

当以这种方式调用回调时,我收到以下信息:

WindowsError: exception: access violation reading 0x00000001

我怀疑这与线程有关,因为当我在分配给它的同一线程中测试回调时,DLL 可以成功调用它,并且我的所有参数都传递给 Python。是否对我用来保持回调的 DLL 中的变量实施了一些保护?

4

1 回答 1

3

来自 ctypes 上的 Python 文档:

回调函数的重要说明:

确保您保留对 CFUNCTYPE 对象的引用,只要它们是从 C 代码中使用的。ctypes 不会,如果您不这样做,它们可能会被垃圾收集,从而在进行回调时使您的程序崩溃。

如果您看到“访问冲突”或“分段错误”并且您正在处理回调,这很可能是原因。正如 JF Sebastian 提到的那样,全局变量是一种选择,尽管我通常会在我的班级中维护一个对活动回调的引用列表。

如果不涉及回调,请仔细检查包装中的类型。声明错误的类型会变得丑陋,而且很难弄清楚。

于 2013-09-04T07:29:49.837 回答