Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

Problème appel fonction d'une DLL


Sujet :

Interfaçage autre langage Python

  1. #1
    Nouveau membre du Club
    Problème appel fonction d'une DLL
    Bonjour,

    Je souhaiterais Loader une dll (en l'occurrence "opengl32.dll) et appeler une fonction de cette dll: glLoadMatrix.

    Pour cela j'utilise le code suivant:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    mylib = cdll.LoadLibrary('OpenGL32.dll')
    DataType = c_float * 16
    matrix = DataType(0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0)
     
    mylib.glLoadMatrixf.restype = c_void_p
    mylib.glLoadMatrixf.argtypes = [POINTER(c_float*16)]
    mylib.glLoadMatrixf(pointer(matrix))


    J'obtiens l'erreur suivante et je ne vois vraiment pas pourquoi:

    ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention

    Je vous remercie d'avance pour votre aide car là je suis vraiment bloqué..

    Alex

  2. #2
    Membre actif
    C'est un problème avec la convention d'appel de la fonction comme indiqué par le message d'erreur. La fonction glLoadMatrixf doit être appelée avec la convention d'appel stdcall. Il ne faut donc pas utiliser cdll pour charger la bibliothèque mais windll. Ce qui donne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import ctypes
    import ctypes.util
     
    name = ctypes.util.find_library('OpenGL32')
    lib = ctypes.windll.LoadLibrary(name)
    DataType = ctypes.c_float * 16
    matrix = DataType(0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0)
     
    lib.glLoadMatrixf.restype = None
    lib.glLoadMatrixf.argtypes = [ctypes.POINTER(ctypes.c_float*16)]
    lib.glLoadMatrixf(ctypes.pointer(matrix))

###raw>template_hook.ano_emploi###