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 :
- DWORD mctl_Initialize(char *szInitFile) ;
|
Code :
- 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 :
- Declare Function mctl_Initialize Lib "c:\CNCworkbench\Control\CAN\CanApi.dll" (ByVal szInitFile As String) As Long
|
et pour l'appel :
Code :
- 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 :
- typedef struct tagDBLAXISPOS // double positions
- {
- double X; // X axis
- double Y; // Y axis
- double Z; // Z axis
- double A; // A revolving around X
- double B; // B revolving around Y
- double C; // C revolving around Z
- double U; // U parallel to X
- double V; // V parallel to Y
- double W; // W parallel to Z
- } DBLAXISPOS, *LPDBLAXISPOS;
|
et les fonctions :
Code :
- DWORD mctl_GetPosition(LPAXISPOS lpPosition, DWORD dwSize) ;
|
Code :
- 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 :
- AXISPOS ax;
- mctl_GetPosition(&ax, sizeof(ax));
|
J'ai essayé donc de convertir en VB.NET ce qui donne :
déclaration de la structure :
Code :
- <StructLayout(LayoutKind.Sequential)> _
- Structure AXISPOS
- Public X As Long
- Public Y As Long
- Public Z As Long
- Public A As Long
- Public B As Long
- Public C As Long
- Public U As Long
- Public V As Long
- Public W As Long
- End Structure
|
Code :
- <DllImport("c:\CNCworkbench\Control\CAN\CanApi.dll", CharSet:=CharSet.Unicode, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
- Public Shared Function mctl_GetPosition(ByRef lpAbsPos As AXISPOS, ByRef dwSize As Long) As Long
- End Function
|
Pour ce qui est de l'appel :
Code :
- 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