Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Interfaçage autre langage
Interfaçage autre langage Forum d'entraide pour l'interfaçage avec d'autres langages (ctypes, api C, swig, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/04/2012, 15h56   #1
xEndLe
Invité régulier
 
Inscription : avril 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 28
Points : 7
Points : 7
Par défaut 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 :
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
xEndLe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2012, 17h08   #2
Montag
Membre actif
 
Inscription : août 2007
Messages : 186
Détails du profil
Informations personnelles :
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : août 2007
Messages : 186
Points : 185
Points : 185
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 :
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))
Montag est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h28.


 
 
 
 
Partenaires

Hébergement Web