utiliser une DLL écrite en C
Bonjour,
J'ai suivi le tutoriel "Créer des dll en C compatibles avec VB 6" :
http://rp.developpez.com/vb/tutoriels/dll/
(je travaille sous Code::Blocks et Visual Basic 2008 express).
Après avoir créé ma DLL en C, je cherche à l'appeler depuis mon programme en VB mais j'ai un message d'erreurs qui persiste malgré les nombreuses tentatives que j'ai fait depuis quelques jour. Le message d'erreur est le suivant :
Citation:
Une exception non gérée s'est produite dans votre application [...]
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
Je précise que la fonction en C que je veux utiliser n'a pas de paramètres et qu'elle retourne un float (soit single en VB).
Quelqu'un peut m'aider à résoudre ce problème?
Merci d'avance.
calling dll c,a partir de vb.net
bonjour les douzes qui font 24
Appeler une fonction c qui renvoie un float .
Voici l'appel d'une fonction C :
-qui renvoie un float.
-qui recoit par adresse (byref en vb.net) un float et renvoie un float.
-qui recoit une chaine (byref ) et renvoie une autre chaine...
projet c win32 "ProjetWin32DllVbNet" :
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
|
//fichier :exemple.c
//fichier :exemple.def vient apres ci-apres pour les symboles exportes(fonctions ou variables visible à l'xterieur de la dll)
#include <WINDOWS.H>
LPCSTR DisplayStringByVal(LPCSTR pszString)
{
return "Hello Dll C Anabase Les DixMille ";
}
void ReturnParamFloat(float* pFloat)
{
*pFloat = *pFloat + 5.5;
}
float fnFloat(void* )
{
float unFloat = 12.0;
unFloat = unFloat + 6.5;
return unFloat;
}
//simple.def
LIBRARY "ProjetWin32DllVbNet"
DESCRIPTION 'Sample C DLL for use with .NET'
EXPORTS
DisplayStringByVal
ReturnParamFloat
fnFloat |
code vb.net projet winform:
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
|
Imports System.Runtime.InteropServices
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' LA SUB CHAINE
Dim Message As String = ""
Message =DisplayStringByVal(Message)
MessageBox.Show(Message)
'LA SUB FLOAT
Dim NumSingle1 As single = 3.0
Call ReturnParamFloat(NumSingle1)
MessageBox.Show(NumSingle1.toString)
'LA FUNCTION FLOAT
Dim NumSingle2 As single = 0.0
NumSingle2= fnFloat()
MessageBox.Show(NumSingle2.toString)
End Sub
<DllImport("ProjetWin32DllVbNet.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function DisplayStringByVal(ByRef Message As String) As string
End Function
<DllImport("ProjetWin32DllVbNet.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Sub ReturnParamFloat(ByRef nombreSingle As Single)
End Sub
<DllImport("ProjetWin32DllVbNet.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function fnFloat() As Single
End Function
End Class |
1/creer le projet Dll Win32 et generer la dll :ProjetWin32DllVbNet.dll
2/creer le projet vb.net ,generer et envoyer dans deboguer l'exe dans le dossier debug du projet c.
3/tester.
bonne soiree.....................
dll c et chemin de fichier
bonjour douze_12
Tout simplement parce que une dll avec directive ImportDll doit se trouver dans le meme dossier que l'exe vb.net.
Sinon le chemin de la dll doit etre inclus en plus de son nom dans la directive Import
exemple code:
Code:
1 2 3 4 5 6
|
' exemple 1:la dll et l'exe vb.net sont dans le meme dossier.
<DllImport("ProjetWin32DllVbNet.dll", CallingConvention:=CallingConvention.Cdecl)> _
'exemple 2: la dll et l'exe vb.net sont dans des dossiers differents.il faut ecrire dans le source vb.net le chemin de la dll.
<DllImport("cheminFichierDll\ProjetWin32DllVbNet.dll", CallingConvention:=CallingConvention.Cdecl)> _ |
Quand je dis generer et envoyer c'est pour quelqu'un d'averti.
Dans vb.net tu fais
Explorateur Sol.->Proprietes Projet->Onglet Debogguer->Chemin ...et tu choisis le dossier debug (de C) .
L'exe vb.net sera ecrit dans ce dossier en meme temps que la dll C.
Ceci fait qu'on est dans le cas 1 et donc on peut tester le projet vb.Net.
bon code....