Salut à tous

Voilà ce petit post qui n'est pas une question mais plutôt une solution à un problème que j'ai eu et que j'ai pu résoudre en naviguant dans pas mal de post à droite et à gauche.
Si jamais il n' a pas ça place ici .Toutes mes excuses aux modérateurs et administrateurs

Voici le problème:
J'ai écris une DLL en C/C++ avec visual studio 2013 et je veux l'utiliser avec CBuilder Xe5.
Voici un extrait du .h et du .cpp de ma DLL (il s'agit de fonction très simple pour vérifier que ça marche).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
// Le bloc ifdef suivant est la façon standard de créer des macros qui facilitent l'exportation 
// à partir d'une DLL. Tous les fichiers contenus dans cette DLL sont compilés avec le symbole MADLL2_EXPORTS
// défini sur la ligne de commande. Ce symbole ne doit pas être défini dans les projets
// qui utilisent cette DLL. De cette manière, les autres projets dont les fichiers sources comprennent ce fichier considèrent les fonctions 
// MADLL2_API comme étant importées à partir d'une DLL, tandis que cette DLL considère les symboles
// définis avec cette macro comme étant exportés.
#ifdef MADLL2_EXPORTS
#define MADLL2_API __declspec(dllexport)
#else
#define MADLL2_API __declspec(dllimport)
#endif
	extern MADLL2_API int nMaDLL2;
 
	MADLL2_API int fnMaDLL2(void);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
 
// MaDLL2.cpp*: définit le point d'entrée pour l'application DLL.
//
 
#include "stdafx.h"
#include "MaDLL2.h"
 
 
#ifdef _MANAGED
#pragma managed(push, off)
#endif
 
BOOL APIENTRY DllMain( HMODULE 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;
}
 
#ifdef _MANAGED
#pragma managed(pop)
#endif
 
// Il s'agit d'un exemple de variable exportée
MADLL2_API int nMaDLL2=0;
 
// Il s'agit d'un exemple de fonction exportée.
MADLL2_API int fnMaDLL2(void)
{
	return 42;
}
Après compilation sous visual studio je récupère 2 fichiers MaDll2.lib et MaDll2.dll
Utilisé tel quel ça ne fonctionne pas j'ai des erreurs au niveau de l'édition de lien. Le fichier MaDll2.lib n'est pas lu par CBuilder. Il faut en construire un nouveau à partir du fichier MaDll2.dll avec l'utilitaire Implib.

Dans une fenêtre console entrez la commande suivante:

ImpLib -a MaDll2.lib et MaDll2.dll

De plus j'ai modifié le .h de la manière suivante

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#ifdef MADLL2_EXPORTS
#define MADLL2_API __declspec(dllexport)
#else
#define MADLL2_API __declspec(dllimport)
#endif
extern "C" {
	extern MADLL2_API int nMaDLL2;

	MADLL2_API int fnMaDLL2(void);
}
Et ça fonctionne. En espérant que ce petit post soit utile à certains