Функции обратного вызова в поле в Python ctypes - PullRequest
2 голосов
/ 14 января 2011

Я пытаюсь зарегистрировать функции обратного вызова для библиотеки .dll в Python с помощью ctypes.Но это требует функций обратного вызова в структуре / поле.Потому что это не работает (без ошибок, но функции обратного вызова ничего не делают), я полагаю, что я не прав.Может ли кто-нибудь помочь мне?

Есть код, который, надеюсь, объясняет, что я пытаюсь сделать:

import ctypes

firsttype = CFUNCTYPE(c_void_p, c_int)
secondtype = CFUNCTYPE(c_void_p, c_int)

@firsttype
def OnFirst(i):
    print "OnFirst"

@secondtype
def OnSecond(i):
    print "OnSecond" 

class tHandlerStructure(Structure):
    `_fields_` = [
    ("firstCallback",firsttype),
    ("secondCallback",secondtype)
    ]

stHandlerStructure = tHandlerStructure()

ctypes.cdll.myDll.Initialize.argtypes = [POINTER(tHandlerStructure)]
ctypes.cdll.myDll.Initialize.restype = c_void_p

ctypes.cdll.myDll.Initialize(stHandleStructure)

Ответы [ 2 ]

1 голос
/ 15 января 2011

Вы должны инициализировать tHandlerStructure:

stHandlerStructure = tHandlerStructure(OnFirst,OnSecond)

В вашем коде есть другие синтаксические ошибки.Лучше всего вырезать и вставлять код, сообщающий об ошибке, а также предоставлять обратные ссылки.Ниже работает:

from ctypes import *

firsttype = CFUNCTYPE(c_void_p, c_int)
secondtype = CFUNCTYPE(c_void_p, c_int)

@firsttype
def OnFirst(i):
    print "OnFirst"

@secondtype
def OnSecond(i):
    print "OnSecond" 

class tHandlerStructure(Structure):
    _fields_ = [
    ("firstCallback",firsttype),
    ("secondCallback",secondtype)
    ]

stHandlerStructure = tHandlerStructure(OnFirst,OnSecond)

cdll.myDll.Initialize.argtypes = [POINTER(tHandlerStructure)]
cdll.myDll.Initialize.restype = c_void_p

cdll.myDll.Initialize(stHandlerStructure)
0 голосов
/ 15 января 2011

Если это полный код, который вы используете, то вы определили и создали экземпляр структуры, но фактически никогда не помещали в нее ваши обратные вызовы.

stHandlerStructure = tHandlerStructure(OnFirst, OnSecond)
...