Malebogia_DCG
Messages postés10Date d'inscriptionlundi 11 septembre 2006StatutMembreDernière intervention30 septembre 2008
-
19 sept. 2008 à 10:01
Malebogia_DCG
Messages postés10Date d'inscriptionlundi 11 septembre 2006StatutMembreDernière intervention30 septembre 2008
-
20 sept. 2008 à 07:48
Bonjour,
J'aimerai connaitre la démarche pour pouvoir utiliser une fonction qui est dans une DLL VB.Net depuis un programme écrit en C.
Exemple de la dll VB :
Public
Module myMod
Function myFunc()
As
Integer
Return 1
End
FunctionEnd
ModuleExemple du code C que j'ai utilisé :
HINSTANCE hDLL;
// Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;
// Function pointer
hDLL = LoadLibrary("e:\\temp\\mydll.dll");
if
(hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"myFunc");
if
(!lpfnDllFunc1)
{
// Do the job ....
}
FreeLibrary(hDLL);
}
La DLL semble se charger et decharger correctement mais le pointeur de fonction est constamment nul. J'ai essayé avec des vairantes telles que :
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myMod.myFunc");
Mais rien n'y fait.
Merci d'avance
A+
Male
A voir également:
Utiliser une fonction dans une DLL VB.Net depuis un programme C
Malebogia_DCG
Messages postés10Date d'inscriptionlundi 11 septembre 2006StatutMembreDernière intervention30 septembre 2008 20 sept. 2008 à 07:48
Désolé pour ma réponse j'ai raté la manip ...
Je refais :
Bon après m'être acharné j'ai réussi à faire tourner le truc mais ça ne me convient pas à 100%.
Premier problème de ma solution : ce n'est pas du C mais du C++
Second problème la DLL est déclarée par regasm de manière statique je ne peux donc pas deployer facilement la solution (enfin si quelqu'un a une meilleure idée je suis preneur).
Sur XP ça se passe bien en étant simple admin mais sur Vista faut carrément lever tous les verrous de l'admin.
La procédure suivante est valable pour VS 2005.
Tout d'abord créer la DLL en VB..; exemple de code pour le projet mydllname :
Code :
Function Addition(ByVal Num1 As Integer, ByVal Num2 As Integer, ByRef Result As Integer) As Integer
End Interface
Public Class Class1
Implements myInterface
Function myFunc(ByVal Num1 As Integer, ByVal Num2 As Integer, ByRef Result As Integer) As Integer Implements myInterface.Addition
Result = Num1 + Num2
Return Result
End Function
End Class
Aller dans les propriétés du projet et régler l'option rendre l'assembly visible par COM (onglet application > bouton informations de l'assembly)
Aller ensuite dans l'onglet signature et signer l'assembly avec un nom fort.
Ici : mydllname.snk
Compiler la dll.
Lancer la commande dos de l'environnement VS, aller dans le dossier de la dll puis taper :
/regasm mydllname.dll /tlb:mydllname.tlb /codebase
Créer le projet en C++ (hé oui en C j'ai pas trouvé j'ai dit)
Exemple de code :
d'abord importer la bibliothèque de type :
Code :
// Import the type library.
#import "ClassLibrary2.tlb"
using namespace ClassLibrary2;
En supposant que la DLL soit placé dans le meme dossier que l'appli CPP (exe ou dll, en général dans le dossier release) et que la TLB soit placée dans le dossier du projet CPP (avec le code source).
Sinon varier les plaisir avec des trucs du genre :
#import "..\mydllname\bin\Release\ClassLibrary2.tlb"
ensuite utiliser la fonction qui vous intéresse comme ceci :
Malebogia_DCG
Messages postés10Date d'inscriptionlundi 11 septembre 2006StatutMembreDernière intervention30 septembre 2008 20 sept. 2008 à 07:39
Bonjour,
J'aimerai connaitre la démarche pour pouvoir utiliser une fonction qui est dans une DLL VB.Net dans un programme écrit en C ?
Exemple de la dll VB :
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
Public
Module myMod
Function myFunc() AsInteger
Return 1
EndFunction
End
Module
<!-- END TEMPLATE: bbcode_code -->Exemple du code C que j'ai utilisé :
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
HINSTANCE hDLL;
// Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
hDLL = LoadLibrary("e:\\temp\\mydll.dll");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myFunc");
if (!lpfnDllFunc1)
{
// Do the job ....
}
FreeLibrary(hDLL);
}
<!-- END TEMPLATE: bbcode_code -->La DLL semble se charger et decharger correctement mais le pointeur de fonction est constamment nul. J'ai essayé avec des vairantes telles que :
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myMod.myFunc");
Mais rien n'y fait.