Utiliser une fonction dans une DLL VB.Net depuis un programme C

Résolu
Malebogia_DCG Messages postés 10 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 30 septembre 2008 - 19 sept. 2008 à 10:01
Malebogia_DCG Messages postés 10 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 30 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

3 réponses

Malebogia_DCG Messages postés 10 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 30 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 :

Code :
   HRESULT hr = CoInitialize(NULL);

   ClassLibrary2::myInterfacePtr myPtr(__uuidof(Class1));
 
   long lResult = 0;
   char buffer[256];

   // Call the Add method.
   myPtr->Addition(12,158, &lResult);

   // Uninitialize COM.
   CoUninitialize();

En espérant que ça puisse vous servir autant qu'à moi.

A+

Male
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 sept. 2008 à 13:25
Salut,

Il y a surement de la recherche a faire du coté de COM/Interop
cf pour avoir un appui pour débuter
ftp://ftp2.developpez.be/developps/dotnet/interopCOM/interopCOM.pdf

Bon courage
0
Malebogia_DCG Messages postés 10 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 30 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.

Merci d'avance

A+

Male

<!-- / message -->
0
Rejoignez-nous