Bonjour,

J'ai besoin d'aide... Voici un résumé de mon soucis
  • Je crée un programme Perl/Tk. Jusque là, je m'en sors. Cependant, pour certaines fonctions, j'ai décidé de passer par un fichier DLL appelé depuis Perl. Et c'est là que les ennuis commencent.
  • Je télécharge donc Code::Blocks que je sais être un bon éditeur C/C++, et je démarre un nouveau projet de DLL.
  • Afin de tester, je crée une fonction toute bête qui multiplie par 3 le nombre passé en paramètres et retourne le résultat et une autre qui retourne une simple chaine de caractères.
  • Je compile ma DLL avec Code::Blocks et le compilateur Gcc (j'ai mingw 64 bits d'installé).
  • Et là où ca déconne, c'est quand je tente d'utiliser ma DLL, l'appel à la fonction Win32::Api->new() de Perl retourne undef et Windows me retourne ce message d'erreur :
    Nom : erreur_dll_01.png
Affichages : 855
Taille : 27,3 Ko
  • Alors je creuse un peu, et je vois sur des forums qu'on recommande le logiciel Dependency Walker pour identifier les erreurs d'une DLL. J'installe donc ce logiciel, et analyse ma DLL avec
  • La seule erreur que remonte DW, c'est "Error: Modules with different CPU types were found."


Voici maintenant les sources que j'utilise :
Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
#!C:/Strawberry/bin/perl.exe
use warnings;
use strict;
 
use Win32::API;
my $function = new Win32::API(
    "genPasswd.dll", "test", "I", "I"
);
print $function->Call(4);
et l'erreur retournée par mon programme Perl :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Can't call method "Call" on an undefined value at GestionnairePasswd.pl line 15.
Et maintenant voici les sources de ma DLL. main.h :
Code CPP : 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
#ifndef __MAIN_H__
#define __MAIN_H__
 
#include <windows.h>
#include <string>
 
using namespace std;
 
/*  To use this exported function of dll, include this header
 *  in your project.
 */
 
#ifdef BUILD_*DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif
 
 
#ifdef __cplusplus
extern "C"
{
#endif
 
DLL_EXPORT string __stdcall getId();
DLL_EXPORT int test(int t);
 
#ifdef __cplusplus
}
#endif
 
#endif // __MAIN_H__

et main.cpp :
Code CPP : 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
#include "main.h"
 
// a sample exported function
DLL_EXPORT string __stdcall getId()
{
    return "Test";
}
 
DLL_EXPORT int test(int t) {
    return t * 2;
}
 
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
 
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
 
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
 
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

Compilateur sélectionné dans Code::Blocks : GNU GCC Compiler

Options du linker (j'ai trouvé ces lignes sur internet pour résoudre une précédente erreur) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
-static-libgcc
-static-libstdc++
Je remercie par avance toutes les personnes qui pourront m'aider

EDIT :
Voici le log de compilation (sans erreur) de ma DLL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
-------------- Build: Release in genPasswd (compiler: GNU GCC Compiler)---------------
 
mingw32-g++.exe -O2 -Wall -DBUILD_DLL  -c D:\Users\Sphinx\Documents\CodeBlocksProjects\genPasswd\main.cpp -o obj\Release\main.o
mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libgenPasswd.def -Wl,--out-implib=bin\Release\libgenPasswd.a -Wl,--dll  obj\Release\main.o  -o bin\Release\genPasswd.dll -s -static-libgcc -static-libstdc++  -luser32
Output file is bin\Release\genPasswd.dll with size 9.50 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))