Utiliser une fonction dans une DLL VB.Net depuis un programme C [Résolu]

Malebogia_DCG 10 Messages postés lundi 11 septembre 2006Date d'inscription 30 septembre 2008 Dernière intervention - 19 sept. 2008 à 10:01 - Dernière réponse : Malebogia_DCG 10 Messages postés lundi 11 septembre 2006Date d'inscription 30 septembre 2008 Dernière intervention
- 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
Afficher la suite 

3 réponses

Répondre au sujet
Malebogia_DCG 10 Messages postés lundi 11 septembre 2006Date d'inscription 30 septembre 2008 Dernière intervention - 20 sept. 2008 à 07:48
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Malebogia_DCG
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 19 sept. 2008 à 13:25
0
Utile
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
Commenter la réponse de nhervagault
Malebogia_DCG 10 Messages postés lundi 11 septembre 2006Date d'inscription 30 septembre 2008 Dernière intervention - 20 sept. 2008 à 07:39
0
Utile
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 -->
Commenter la réponse de Malebogia_DCG

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.