OVH Cloud OVH Cloud

DLL en C++ utilisable en VB

1 réponse
Avatar
jean saint jalmes
Bonjour,

Je veux écrire une DLL en C++ utilisable en VB.

Le fichier CIAM_CCA.cpp contient :

// CIAM_CCA.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "CIAM_CCA.h"

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID
lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

CIAM_CCA_API int fnCIAM_CCA(void)
{
return 42;
}

Le fichier CIAM_CCA.h contient :

#ifdef CIAM_CCA_EXPORTS
#define CIAM_CCA_API __declspec(dllexport)
#else
#define CIAM_CCA_API __declspec(dllimport)
#endif

CIAM_CCA_API int fnCIAM_CCA(void);

La compilation et l'édition de liens ne pose aucun problème.

Sous VB, je déclare cette DLL comme suit :

Private Declare function fnCIAM_CCA Lib "CIAM_CCA" () as long

Private sub Test
msgbox fnCIAM_CCA
End sub

et j'obtient le message suivant :

Point d'entrée fnCIAM_CCA d'une DLL introuvable dans C:\.....\CIAM_CCA.dll

Pouvez-vous m'aider ?

Merci d'avance, Jean

1 réponse

Avatar
Jean-Marc
"jean saint jalmes" a écrit dans
le message de news:
Bonjour,

Je veux écrire une DLL en C++ utilisable en VB.

Le fichier CIAM_CCA.cpp contient :

// CIAM_CCA.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "CIAM_CCA.h"

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID
lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

CIAM_CCA_API int fnCIAM_CCA(void)
{
return 42;
}

Le fichier CIAM_CCA.h contient :

#ifdef CIAM_CCA_EXPORTS
#define CIAM_CCA_API __declspec(dllexport)
#else
#define CIAM_CCA_API __declspec(dllimport)
#endif

CIAM_CCA_API int fnCIAM_CCA(void);

La compilation et l'édition de liens ne pose aucun problème.

Sous VB, je déclare cette DLL comme suit :

Private Declare function fnCIAM_CCA Lib "CIAM_CCA" () as long

Private sub Test
msgbox fnCIAM_CCA
End sub

et j'obtient le message suivant :

Point d'entrée fnCIAM_CCA d'une DLL introuvable dans C:.....CIAM_CCA.dll

Pouvez-vous m'aider ?




Hello,

oui on peut t'aider :-))



Tu as presque tout bon, sauf pour la déclaration en VB,
qui doit être comme ceci:

Private Declare Function fnCiam_CCA Lib
"C:JMDvpmtVCCIAM_CCADebugCIAM_CCA.dll" Alias "?fnCIAM_CCA@@YAHXZ" ()
As Integer

Et hop, ca marche du premier coup.

Comment se fait-ce ? Très simple:
le nom d'export de la fonction de la DLL n'est pas le
nom tel qu'il est écrit dans ton .cpp, mais un nom
calculé par le compilateur.

Tu obtiens ces noms en cochant l'option Generate Map File
dans les settings du compilateur. Tu regardes ensuite le
fichier .map généré dans lequel tu trouveras ceci:

??4CCIAM_CCA@@@@Z 10001030 f i CIAM_CCA.obj
10001070 f CIAM_CCA.obj
?fnCIAM_CCA@@YAHXZ 100010b0 f CIAM_CCA.obj
100010e0 f LIBCMTD:dllcrt0.obj


Bref, tout ceci est expliqué dans un petit tutorial de mon
cru, que tu retrouveras ici:
http://users.skynet.be/candide/tuto/cetvb.htm

Petit conseil: quand tu créés ton projet, ne demande pas
"A simple dll that export some symbols" mais simplement
"an empty dll", c'est plus facile de gérer après.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;