2016-07-01 5 views
0

Windows 7에서 Python Ctypes를 사용하여 C++ DLL에 액세스하고 있습니다. DLL 설명서가 있지만 실제로 열 수 없습니다. 함수를 사용하는 C++ 함수를 사용하려고합니다.이 함수는 부호없는 int와 void 포인터를 차례로 사용합니다.Ctypes - 파이썬에서 무효 포인터 전달

내가 마지막 줄에이 오류가이 코드를 실행 할 때마다
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. 

난 정말이 문제를 접근하는 방법을 알고하지 않기 때문에, 여기에 실패 짧은 코드 샘플입니다 Python 오류가 아닌 C++ 오류입니다. C++에서 온라인으로 찾은 비슷한 오류가 포인터와 관련되어 있기 때문에 내 무효 포인터와 관련이 있다고 생각합니다. Ctypes void 포인터에 문제가 있습니까? 아니면 잘못된 것이 있습니까?

+1

빠른 구글은'Toupcam_StartPullModeWithCallback'은 카메라, 콜백, 컨텍스트라는 세 가지 인수를 취한다는 것을 보여줍니다. http://www.webastro.net/forum/archive/index.php/t-138355.html – kfsone

답변

0

argtypes을 사용하여 호출하는 함수의 인수 유형을 선언해야합니다.

typedef void (*CB)(int a); 

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

파이썬 코드 :

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 
콜백와

윈도우 C DLL 코드 : 나는 당신의 정확한 API를 알 수 없기 때문에, 여기에 예입니다