[VB.NET] Appel d'une DLL écrite en C++

Appel d'une DLL écrite en C++ [VB.NET] - C#/.NET managed - Programmation

Marsh Posté le 12-06-2012 à 12:13:19    

Bonjour à tous,
 
Je me permet de venir poster ici car je galère à communiquer avec une DLL écrite en C++.
 
Pour situer le problème, je travaille pour une boite de micro-usinage laser et ma mission actuelle est d'écrire un soft permettant de piloter des axes X,Y,Z et Theta sur une nouvelle machine, fournie par un client allemand.
 
J'ai donc reçu une documentation, ainsi que certaines DLL qui permettent de piloter les différents axes. Mon soft est écris en VB.NET.
 
J'ai donc : Une DLL écrite en C++ par une personne inconnue, une documentation permettant de communiquer avec la DLL (avec des exemples en c++).
 
J'arrive a communiquer avec la dll sur certaines fonctions ne nécessitant pas d'arguments, ou juste une chaine de caractère.
 
Par exemple : voici l'appel de fonction en C :  
 

Code :
  1. DWORD mctl_Initialize(char *szInitFile) ;


Code :
  1. typedef DWORD (_stdcall * MCTL_INITIALIZE)(char *);


 
(Je vous ai mis les code que j'ai au niveau du C++)
 
Ce qui me donne en VB.NET :  

Code :
  1. Declare Function mctl_Initialize Lib "c:\CNCworkbench\Control\CAN\CanApi.dll" (ByVal szInitFile As String) As Long


et pour l'appel :

Code :
  1. lResult = FonctionTableIsel.mctl_Initialize(stringAxeConfig)

(stringAxeConfig contient le path d'un fichier INI servant a initialiser la machine)
 
 
Donc pour cet appel pas de soucis !  
 
Par contre, là ou je bloque c'est par exemple pour récupérer les positions des axes. Cela passe par une structure.
 
En C++ :
 
Structure de la position des axes :
 

Code :
  1. typedef struct tagDBLAXISPOS   // double positions
  2.   {
  3.   double X;        // X axis               
  4.   double Y;        // Y axis               
  5.   double Z;        // Z axis               
  6.   double A;        // A revolving around X  
  7.   double B;        // B revolving around Y  
  8.   double C;        // C revolving around Z  
  9.   double U;        // U parallel to X       
  10.   double V;        // V parallel to Y       
  11.   double W;        // W parallel to Z       
  12.   } DBLAXISPOS, *LPDBLAXISPOS;


 
et les fonctions :
 

Code :
  1. DWORD mctl_GetPosition(LPAXISPOS lpPosition, DWORD dwSize) ;


Code :
  1. typedef DWORD (_stdcall * MCTL_GETPOSITION)(LPAXISPOS, DWORD);


 
 
J'ai également reçu un petit exemple en C++ qui permet de passer la structure en argument. Cela donne :
 

Code :
  1. AXISPOS ax;
  2. mctl_GetPosition(&ax, sizeof(ax));


 
 
J'ai essayé donc de convertir en VB.NET ce qui donne :
 
déclaration de la structure :
 

Code :
  1. <StructLayout(LayoutKind.Sequential)> _
  2. Structure AXISPOS
  3.     Public X As Long
  4.     Public Y As Long
  5.     Public Z As Long
  6.     Public A As Long
  7.     Public B As Long
  8.     Public C As Long
  9.     Public U As Long
  10.     Public V As Long
  11.     Public W As Long
  12. End Structure


 

Code :
  1. <DllImport("c:\CNCworkbench\Control\CAN\CanApi.dll", CharSet:=CharSet.Unicode, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
  2. Public Shared Function mctl_GetPosition(ByRef lpAbsPos As AXISPOS, ByRef dwSize As Long) As Long
  3. End Function


 
Pour ce qui est de l'appel :
 

Code :
  1. lResult = mctl_GetPosition(axisPos , Marshal.SizeOf(axisPos))


 
Et donc voila je suis bloqué à ce point la je n'arrive apparemment pas à convertir ce code en vb.net.  
 
La structure passée dans l'appel de fonction ne me retourne rien.
 
Merci pour votre aide !
 
Bien à vous,
 
QuiGi


Message édité par QuiGon Gin le 12-06-2012 à 13:57:39
Reply

Marsh Posté le 12-06-2012 à 12:13:19   

Reply

Marsh Posté le 12-06-2012 à 21:05:47    

Les champs de ta structure C, sont déclarés en double (en général 8 octets). Tu les as déclarés "Long" en VB (probablement 4 octets). Ça ne me parait pas bon. Aussi le ByRef pour le dwSize me parait inutile.

Reply

Marsh Posté le 13-06-2012 à 10:17:22    

Merci pour ta réponse, je regarde ça !
 
QuiGi

Reply

Sujets relatifs:

Leave a Replay

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