Déclaration DLL C avec VB.net
Bonjour,
Je souhaite utiliser une Dll développée en C (Je n'ai pas les sources juste le .h) dans une application VB.net (VB 2008 Express).
Les fonctions de la Dll fonctionnent déjà dans une application Labwindows/CVI (en C).
J'ai l'impression que j'appelle mes fonctions de façon équivalentes dans mes applications CVI et VB.
Mais je voudrais savoir si je fait correctement ma déclaration et mon appel en VB. Mes compétences en VB sont assez minces.
Déclaration dans le .h de la DLL
Code:
1 2
| // Déclaration dans la DLL
__declspec(dllexport) int M_Connect(char *pszDestIP,unsigned short usPort,unsigned char ucSlaveAddr,int *piCId); |
Code CVI
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| // Code CVI
int nStatus;
char pcRemoteIP[16];
int piCId;
unsigned short usPort=0;
unsigned short ucSlaveAddr=0;
// Récupération des paramètres de la connection TCP/IP //
// Adresse IP : Chaine de caractère
GetCtrlVal(panelHandle, PANEL_STR_IPADDR, pcRemoteIP);
// Numéro de port
GetCtrlVal(panelHandle, PANEL_NUM_PORT, &usPort);
// Slave adresse
GetCtrlVal(panelHandle, PANEL_NUM_SLAVE, &ucSlaveAddr);
// Connection
nStatus = M_Connect(pcRemoteIP, usPort, ucSlaveAddr, &piCId); |
Code VB
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| ' Declaration des fonctions de la DLL '
Private Declare Function MDB_Connect Lib "LibMasterModbusTCP.dll" (ByRef pszDestIP As Char, ByVal usPort As Short, ByVal ucSlaveAddr As Short, ByRef piCId As Integer) As Integer
' Init interface '
Private Sub SupervisorModbus_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim psIPAddress As String
Dim pcIPAddress As Char()
Dim nStatus As Integer
Dim usPort As Short
Dim ucSlaveAddr As Short
Dim s_iCId(1) As Integer
' Récupération des paramètres de la connection TCP/IP '
' Adresse IP : TxtIPAddress = TextBox
psIPAddress = TxtIPAddress.Text
pcIPAddress = psIPAddress.ToCharArray()
' Numéro de port : NumPort = NumericUpDown
usPort = NumPort.Value
' Slave adresse : NumSlaveId = NumericUpDown
ucSlaveAddr = NumSlaveId.Value
' Ouverture d'une communication avec le TPLC '
nStatus = M_Connect(pcIPAddress(0), usPort, ucSlaveAddr, s_iCId(0))
End Sub |
Merci d'avance pour vos réponses
appel de .dll c en vb.net
bonjour Jérèm32.
Prends bien garder de declarer ta fonction dans le fichier .vb grace à l'API DllImport.
La declaration a pour but de preciser :
-non seulement le mode de transmission des parametres (byVal ou byRef) comme dit par Pol63 et les types appropries
-mais egalement la convention d'appel :Cdecl pour le C.
voici ton code revu:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
'ajoutez une instruction Imports en haut du
'code de la classe du formulaire de départ :
Imports System.Runtime.InteropServices
Public Class SupervisorModbus
'Cette declaration de ta fonction M_Connect a pour but justement d'eclaircir le mode de transmission des
'parametres en Vb.Net;
'-par valeur => ByVal
'-par reference(adresse)=>ByRef
'(VBnet :ByRef maVariable as Type<=>C: Type *maVariable)
'-Convention d'appel : CallingConvention.Cdecl pour C.
'-nom du fichier .dll qui contient notre fonction(exemple:Connect.dll)
'
<DllImport("Connect.dll", _
CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function M_Connect( _
ByRef pcRemoteIP As String, _
ByVal usPort As UShort, ByVal ucSlaveAddr As Byte, ByRef piCId As Integer) _
As Integer
' Leave the body of the function empty.
End Function
Private Sub SupervisorModbus_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim psIPAddress As String
'à virer inutile
'Dim pcIPAddress As Char()
Dim nStatus As Integer
Dim usPort As Short
Dim ucSlaveAddr As Byte
'à virer
'Dim s_iCId(1) As Integer
Dim s_iCId As Integer 'comme dans CVI.
' Récupération des paramètres de la connection TCP/IP '
' Adresse IP : TxtIPAddress = TextBox
'psIPAddress = TxtIPAddress.Text
' remplacer directement par:
psIPAddress = TxtIPAddress.Text
' Numéro de port : NumPort = NumericUpDown
usPort = NumPort.Value
' Slave adresse : NumSlaveId = NumericUpDown
ucSlaveAddr = NumSlaveId.Value
' Ouverture d'une communication avec le TPLC '
'nStatus = M_Connect(pcIPAddress(0), usPort, ucSlaveAddr, s_iCId(0))
' remplacer par:
nStatus = M_Connect(psIPAddress, usPort, ucSlaveAddr, s_iCId)
End Sub
End Class |
bon code...............