从Python传递Void指针的Ctypes

2024-03-28 10:26:10 发布

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

我在Windows 7上使用Python cType访问C++ DLL。我有DLL的文档,但实际上我无法打开它。我尝试使用C++函数,它包含一个函数,而函数又包含一个无符号int和一个空指针。下面是一个失败的简短代码示例:

import ctypes
import os

root = os.path.dirname(__file__)
lib = ctypes.WinDLL(os.path.join(root, 'x86', 'toupcam.dll')) #works

cam = lib.Toupcam_Open(None) #works

def f(event, ctx): #Python version of function to pass in
    pass

#converting Python function to C function:
#CFUNTYPE params: return type, parameter types
func = ctypes.CFUNCTYPE(None, ctypes.c_uint, ctypes.c_void_p)(f)

res = lib.Toupcam_StartPullModeWithCallback(cam, func) #fails

每当我运行此代码时,最后一行会出现以下错误:

^{pr2}$ 我真的不知道如何处理这个问题,因为它是C++错误而不是Python错误。我认为这与我的空指针有关,因为我在C++中发现的类似错误是指针相关的。Ctypes void指针有问题吗,还是我做错了什么?在


Tags: path函数代码importoslib错误function
1条回答
网友
1楼 · 发布于 2024-03-28 10:26:10

您需要声明使用argtypes调用的函数的参数类型。由于我不知道您的确切API,下面是一个示例:

带有回调的Windows C DLL代码:

typedef void (*CB)(int a);

__declspec(dllexport) void do_callback(CB func)
{
    int i;
    for(i=0;i<10;++i)
        func(i);
}

Python代码:

^{pr2}$

输出:

0
1
2
3
4
5
6
7
8
9

相关问题 更多 >