用ctypes调用C库的python函数

2024-06-01 11:16:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个c语言的DLL,用于windows平台,其结构类似于以下内容:

C结构

typedef struct some_struct {
    int (_stdcall *function)(int arg1, int arg2);
    ...
}SOME_STRUCT;

我定义了一个pythonctypes结构,用下面的代码模拟

Python结构

^{pr2}$

C代码中这个结构的重点是注册一个回调函数,该函数在它自己的线程中对某些触发器执行。如果可能的话,我想要做的是将回调设置为一个Python函数,这样当C结构中的函数从C代码中被调用时,执行的是Python函数。在

我在python中尝试实现这一点(这不起作用)如下:

def func(arg1,arg2):
    print('I was called!')
    return 0

struct = SOME_STRUCT()
prototype = CFUNCTYPE(c_int, c_int, c_int)
struct.function = byref(prototype(func))

我得到的具体错误(这可能不是我唯一的问题)是它抱怨struct.function需要一个LP_CFunctionType实例,但得到了一个CArgObject实例。我该怎么做我想做的事?在


Tags: 实例函数代码语言functionsome结构struct
1条回答
网友
1楼 · 发布于 2024-06-01 11:16:11

下面是一个工作示例和测试DLL源代码。奇怪的是,当回调是结构的唯一成员时,我无法使它工作(崩溃)。它看起来像是一个bug,因为没有结构包装器的回调或向结构添加第二个成员就可以使它工作。在

注意事项:

  • WINFUNCTYPE__stdcall一起使用。CFUNCTYPE表示__cdecl。在
  • 您不需要POINTER或{}来让它工作。在
  • @CALLBACK修饰符等价于func = CALLBACK(func)。在

测试c

#include <stdio.h>

typedef int (__stdcall *CALLBACK)(int arg1, int arg2);

typedef struct some_struct {
    CALLBACK function;
    int other;
} SOME_STRUCT;

__declspec(dllexport) int func(SOME_STRUCT* pss)
{
    printf("%d\n",pss->other);
    return pss->function(1,2);
}

测试.py

^{pr2}$

输出

7
3

相关问题 更多 >