probleme pour utiliser des fonctions c++ dans des dll

probleme pour utiliser des fonctions c++ dans des dll - Python - Programmation

Marsh Posté le 10-03-2006 à 09:23:25    

bonjour a tous,
 
je me forme à python depuis le debut de la semaine et j'utilise SPE comme IDE sous windows.
j'ai déja bien avancé mais je suis face à un problème que je n'arrive pas a résoudre.
On m'a fourni des DLL développé sous visual c++ (ainsi que les sources) et j'essaye d'importer les fonctions de cette DLL.
j'ai fais pas mal de recherche et j'ai trouvé "ctypes"  
 
voila mon code :

Code :
  1. >>>from ctypes import *
  2. >>>essai = cdll.load("fichier.dll", mode=None)
  3. >>>essai.Close()
  4. Traceback (most recent call last):
  5.   File "<input>", line 1, in ?
  6.   File "C:\Python24\Lib\site-packages\ctypes\__init__.py", line 313, in __getattr__
  7.     return self.__getitem__(name)
  8.   File "C:\Python24\Lib\site-packages\ctypes\__init__.py", line 316, in __getitem__
  9.     func = self._FuncPtr(name, self)
  10. AttributeError: function 'Close' not found


 
alors que dans le fichier .h des sources, cette fonction close existe :

Code :
  1. public:
  2. unsigned char Init    (void* pCanal, CString num_port, int vitesse, int iNbRepMaxParam, int timeout_rec, int timeout_ack, int nb_err_max, DATAREC_CALLBACK setDataRec);
  3. unsigned char Close   (void);
  4. unsigned char Relance (void);
  5. unsigned char Send    (unsigned char *buff_emi, unsigned char longueur);
  6. unsigned char Receive (unsigned char *buffer_donnees, int *longueur);


 
je ne comprend pas comment faire pour utiliser ce module ctypes...
 
alors si vou spouviez m'aider :)
 
merci


---------------
Mes ventes vers Grenoble & Gresivaudan
Reply

Marsh Posté le 10-03-2006 à 09:23:25   

Reply

Marsh Posté le 12-03-2006 à 09:45:52    

ta fonction est visible que par la class, d'abord il faut instancier la class  et ensuite utiliser  Close() avec cet instance

Reply

Marsh Posté le 13-03-2006 à 09:09:10    

be en faisant essai = cdll.load("fichier.dll", mode=None) je cré bien une instance de la classe non?


---------------
Mes ventes vers Grenoble & Gresivaudan
Reply

Marsh Posté le 13-03-2006 à 13:07:58    

Non. en faisant essai = cdll.load(...) tu as acces au dll non pas au(x) classe(s) se trouvant à l'interieur de dll. Je crois qu'il y a qq probleme avec ctypes pour utiliser les class de C++ ... Pour surmonter les difficultés de ctypes, cad pour instancier la class il peut eventuellement avoir une fonction dans le dll qui return une instance. Tu peux essayer le code ci dessous (le resultat  n'est pas garantie). Si non il faut utiliser  SWIG .  
 
dans le dll:
class MyClass{  
....
public:
unsigned char Close  (void){ ....}
};
MyClass doClass(..){
return new MyClass();
}
en python:
essai = cdll.load("fichier.dll", mode=None)
z= essai.doClass()
z.Close()

Reply

Marsh Posté le 13-03-2006 à 14:02:21    

merci de la reponse
 
hum mais le hic c'est que je peux pas modifier la DLL :/
 
je vais chercher du coter de swig car je ne sais pas ce que c'est.


---------------
Mes ventes vers Grenoble & Gresivaudan
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed