!!! édition
Erreur corrigée. Ne répondez pas à cette discussion SVP.
Je vais apporter quelques modifs et re-éditer encore

!!! édition
Voila, j'ai corrigée l'erreur toute seule.
Certains trouveront peut-être un intérêt à un exemple simple qui marche.
Anyway, les commentaires sont les bienvenus.


Bonjour,

Je sollicite votre aide pour un problème de compilation de DLL.
C'est pourtant quelque chose que j'ai déjà fait, mais ici j'ai quelques contraintes et je ne m'en sort plus.

- Je compile en C++ et pas en C (Bon, ceci n'est pas une contrainte mais plutôt une simplification. Inutile donc d'ajouter des #ifdef __cplusplus)

- La DLL doit être appelée par Python (Et en l'état actuel, ça marche)

Les problèmes commencent :

- La ligne de compilation qui génère le test.exe ne doit pas faire de référence à un fichier .a ou .lib
Il faut imaginer que l'utilisateur C++ qui veut utiliser cette DLL n'a à sa disposition que la DLL elle-même et le test.h qui contient les prototypes des fonctions à importer.
Ici, je n'ai pas encore fait le .h car c'est un test, je n'ai qu'une seule fonction, je peut répéter la ligne de déclaration par copie pour le moment.

Le problème c'est que je n'en suis même pas là :

La fonction LoadLibrary() retourne toujours 0 !
Retourne zéro en C++, en Python ça marche.
La DLL exporte donc bien ses fonctions.
C'est quand même un comble que je n'arrive pas à les rappeler en C++ !
Quelqu'un voit-il l'erreur ?

test_dll.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
#define EXPORT extern "C" __declspec(dllexport)
 
EXPORT int sum(int a, int b) {
    return a + b;
}
test_exe.cpp
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
#include <stdio.h>
#include <windows.h>
using namespace std;
 
 
int main () {
 
	HINSTANCE hDll = LoadLibrary("test.dll");
 
	if ( hDll==0 ) {
		printf( "%s\n", "Erreur de chargement de la dll" );
	} else {
 
		typedef int (__stdcall *sum_Type)(int, int);
		sum_Type sum = (sum_Type) GetProcAddress( hDll, (LPSTR)"sum" );
 
		printf( "%i\n", sum( 2, 3 ));
	}
 
	return 0;
 
}
Compilation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
gcc -shared test_dll.cpp -o test.dll    -Wall -W
 
gcc test_exe.cpp -o test.exe    -Wall -W
test.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
import ctypes
 
MyDll = ctypes.cdll.LoadLibrary('test.dll')
 
print MyDll.sum(5, 3)