我在Windows 7上使用Python Ctypes访问C ++ DLL。我有DLL的文档,但我实际上无法打开它。我正在尝试使用一个接受函数的C ++函数,该函数又接受一个unsigned int和一个void指针。这是一个失败的短代码示例:
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
每当我运行此代码时,我都会在最后一行收到此错误:
OSError: exception: access violation writing 0x002CF330.
我真的不知道如何处理这个问题,因为它是C ++错误而不是Python错误。我认为这与我的void指针有关,因为我在网上找到的与C ++类似的错误与指针有关。 Ctypes void指针有什么问题,或者我做错了什么?
答案 0 :(得分:0)
您需要使用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代码:
from ctypes import *
# You can use as a Python decorator.
@CFUNCTYPE(None,c_int)
def callback(a):
print(a)
# Use CDLL for __cdecl calling convention...WinDLL for __stdcall.
do_callback = CDLL('test').do_callback
do_callback.restype = None
do_callback.argtypes = [CFUNCTYPE(None,c_int)]
do_callback(callback)
输出:
0
1
2
3
4
5
6
7
8
9