2016-07-01 25 views
0

Windows 7でPython Ctypesを使用してC++ DLLにアクセスしていますが、DLLのドキュメントがありますが、実際には開くことができません。私は関数を取り込むC++関数を使用しようとしています。関数はunsigned intとvoidポインタを取ります。ここで失敗した短いコードサンプルは次のとおりです。Ctypes - Pythonから無効ポインタを渡す

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++のためにオンラインで見つけた同様のエラーはポインタ関連であったので、私のvoidポインタと関係があると思います。 Ctypes voidポインターに問題がありますか?何か間違っていますか?

+1

クイックグーグルは、 'Toupcam_StartPullModeWithCallback'はカメラ、コールバック、コンテキストの3つの引数を取ることを示しています。 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); 
} 

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 
コールバックと

のWindows C DLLコード:私はあなたの正確なAPIを知らないので、ここでの例です

関連する問題