Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1431 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2145456
QuiGon Gin
Posté le 12-06-2012 à 12:13:19  profilanswer
 

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
mood
Publicité
Posté le 12-06-2012 à 12:13:19  profilanswer
 

n°2145595
tpierron
Posté le 12-06-2012 à 21:05:47  profilanswer
 

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.

n°2145644
QuiGon Gin
Posté le 13-06-2012 à 10:17:22  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
C++ Builder 6 - Utiliser une liste déroulante[C] Aide pour petit exo 2
[C] Aide pour petit exo[C/SDL] Rotation Image/Positionnement
Wrapper C++ avec SWIGAppel fonction Javascript dans variable PHP
[VB.net] Si tel périphérique USB est branché, alors...Appel aux dieux du SQL, à vos claviers ! ( optimisation requête... )
aide: moulinette SVP avec Exel et VB 
Plus de sujets relatifs à : [VB.NET] Appel d'une DLL écrite en C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR